哈密顿路径在图G中找出一条包含所有顶点的简单路径,该路径称为哈密顿路径(1)图G是非完全有向图,且图G不一定存在哈密顿路径; > (2)设计算法判断图G是否存在哈密顿路径,如果存在,输出一天哈密顿路径

简介: 哈密顿路径在图G中找出一条包含所有顶点的简单路径,该路径称为哈密顿路径(1)图G是非完全有向图,且图G不一定存在哈密顿路径; > (2)设计算法判断图G是否存在哈密顿路径,如果存在,输出一天哈密顿路径

1、问题描述

在图G中找出一条包含所有顶点的简单路径,该路径称为哈密顿路径

2、基本要求

(1)图G是非完全有向图,且图G不一定存在哈密顿路径;

(2)设计算法判断图G是否存在哈密顿路径,如果存在,输出一天哈密顿路径即可;

(3)分析算法的时间复杂度

3、设计思想

寻找哈密顿路径的过程是一个深度优先遍历的过程。在遍历过程中,如果有回溯,说明遍历经过的路线中存在重复访问的节点,所以,可以修改深度优先遍历算法,使其在遍历过程中取消回溯。

以下代码仅供参考

以下代码仅供参考

以下代码仅供参考

/**
 *作者:魏宝航
 *2020年11月22日,下午21:47
 */
import java.io.IOException;
import java.util.Scanner;
public class MatrixUDG {
    private char[] mVexs;       
    private int[][] mMatrix;   
    private int num;
    private int edge;
    private boolean[] visit;
    private int[] road;
    private static int count=0;
    private int m=0;
    public MatrixUDG(char[] vexs, char[][] edges) {
        num = vexs.length;
        edge = edges.length;
        visit=new boolean[num+10];
        road=new int[num+10];
        mVexs = new char[num];
        for (int i = 0; i < mVexs.length; i++)
            mVexs[i] = vexs[i];
        mMatrix = new int[num][num];
        for(int i=0;i<edge;i++){
            for(int j=0;j<edge;j++){
                if(edges[i][j]=='∞'){
                    mMatrix[i][j]=Integer.MAX_VALUE;
                }
                else{
                    mMatrix[i][j]=1;
                }
            }
        }
    }
    public void print() {
        System.out.printf("Martix Graph:\n");
        for (int i = 0; i < mVexs.length; i++) {
            for (int j = 0; j < mVexs.length; j++){
                if(mMatrix[i][j]<Integer.MAX_VALUE){
                    System.out.printf("%d ", mMatrix[i][j]);
                }else{
                    System.out.print("∞ ");
                }
            }
            System.out.printf("\n");
        }
    }
    public void DFS(int v){
        visit[v]=true;
        road[count++]=v;
        for(m=0;m<num;m++){
            if(mMatrix[v][m]==1&&visit[m]==false){
                DFS(m);
            }
        }
        if(m==num){
            visit[v]=false;
            count--;
        }
    }
    public void Hamilton(){
        for(int i=0;i<num;i++){
            DFS(i);
        }
        System.out.print(road[0]+1);
        for(int i=1;i<num;i++){
            System.out.print("->"+(road[i]+1));
        }
    }
    public static void main(String[] args) {
        char[] vexs2={'1','2','3','4'};
        char[][] edges2=new char[][]{
                {'∞','1','1','∞'},
                {'∞','∞','∞','∞'},
                {'∞','1','∞','1'},
                {'∞','1','∞','∞'},
        };
        MatrixUDG g=new MatrixUDG(vexs2,edges2);
        g.print();
        g.Hamilton();
    }
}


目录
相关文章
|
2月前
|
算法
算法修炼-动态规划之路径问题(1)
算法修炼-动态规划之路径问题(1)
|
2月前
|
算法 Java
算法:Java计算二叉树从根节点到叶子结点的最大路径和
算法:Java计算二叉树从根节点到叶子结点的最大路径和
|
3月前
|
传感器 算法 自动驾驶
混合A*运动规划算法:路径规划和路径跟踪-MPC-LQR-PID算法
混合A*运动规划算法:路径规划和路径跟踪-MPC-LQR-PID算法
87 0
混合A*运动规划算法:路径规划和路径跟踪-MPC-LQR-PID算法
|
3月前
|
算法 测试技术 C++
【动态规划】【图论】【C++算法】1575统计所有可行路径
【动态规划】【图论】【C++算法】1575统计所有可行路径
|
3月前
|
算法
【算法优选】 动态规划之路径问题——贰
【算法优选】 动态规划之路径问题——贰
|
4月前
|
算法 搜索推荐 图计算
图计算中的社区发现算法是什么?请解释其作用和常用算法。
图计算中的社区发现算法是什么?请解释其作用和常用算法。
30 0
|
5月前
|
存储 算法
算法编程(二十六):判断路径是否相交
算法编程(二十六):判断路径是否相交
29 0
|
5天前
|
存储 算法
图的深度优先算法
图的深度优先算法
13 0
|
7天前
|
算法 数据可视化 大数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
35 13
|
2月前
|
算法 机器人
算法沉淀 —— 动态规划篇(路径问题)
算法沉淀 —— 动态规划篇(路径问题)
27 0