一个无向连通图G点上的哈密尔顿(Hamilton)回路是指从图G上的某个顶点出发

admin2022-08-02  39

问题 一个无向连通图G点上的哈密尔顿(Hamilton)回路是指从图G上的某个顶点出发,经过图上所有其他顶点一次且仅一次,最后回到该顶点的路径。一种求解无向图上哈密尔顿回路算法的基本思想如下:假设图G存在一个从顶点V0出发的哈密尔顿回路V0——V1——V2——V3——...——Vn-1——V0。算法从顶点V0出发,访问该顶点的一个未被访问的邻接顶点V1,接着从顶点V1出发,访问V1一个未被访问的邻接顶点V2,…;对顶点Vi,重复进行以下操作:访问Vi的一个未被访问的邻接接点Vi+1;若Vi的所有邻接顶点均已被访问,则返回到顶点Vi-1,考虑Vi-1的下一个未被访问的邻接顶点,仍记为Vi;直到找到一条哈密尔顿回路或者找不到哈密尔顿回路,算法结束。【C代码】下面是算法的C语言实现。(1)常量和变量说明n:图G中的顶点数c[][]:图G的邻接矩阵k:统计变量,当期已经访问的定点数为k+1x[k]:第k个访问的顶点编号,从0开始visited[x[k]]:第k个顶点的访问标志,0表示未访问,1表示已访问(2)C程序#include<stido.h>#include<stidb.h>#define MAX 100void Hamilton(int n,int x[MAX],int c[MAX][MAX]){int i;int visited[MAX];int k;/*初始化x数组和visited数组*/for(i=0:i<n;i++){x=0;visited=0;}/*访问起始顶点*/k=0(1);x[0]=0;k=k+1;/*访问其他顶点*/while(k>=0){x[k]=x[k]+1;while(x[k]<n){if((2)&&c[x[k-1]][x[k]]==1){/*邻接顶点x[k]未被访问过*/break;}else{x[k]=x[k]+1}}if(x[k]<n&&k==n-1&&(3)){/*找到一条哈密尔顿回路*/for(k=0;k<n;k++){printf(〝%d--〝,x[k]);/*输出哈密尔顿回路*/}printf(〝%d\n〝,x[0]);return;}else if(x[k]<n&&k<n-1){/*设置当前顶点的访问标志,继续下一个顶点*/(4)k=k+1;}else{/*没有未被访问过的邻接顶点,回退到上一个顶点*/x[k]=0;visited[x[k]]=0;(5);}}}【问题1】(10分)根据题干说明。填充C代码中的空(1)~(5)。【问题2】(5分)根据题干说明和C代码,算法采用的设计策略为(6),该方法在遍历图的顶点时,采用的是(7)方法(深度优先或广度优先)。

选项

答案

解析 【问题1】
1、visited[0]=1
2、visited[x[k]]==0
3、c[x[k]][0]==1
4、visited[x[k]]=1
5、k=k-1
【问题2】
6、回溯法
7、深度优先
哈密顿图是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。在图论中是指含有哈密顿回路的图,闭合的哈密顿路径称作哈密顿回路,含有图中所有顶点的路径称作哈密顿路径。
回溯法是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯(其实回溯法就是对隐式图的深度优先搜索算法)。若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。
算法题历来都被认为是比较难的题,一个程序开发人员都不喜欢看别人的代码。但是要得分也不是太难。
问题2比较容易得分,而且第二空就是个二选一的填空。只要了解到回溯法的相关原理,基本可以得满分。对于问题1就需要花一些心思,去读懂题干和代码,但是这里的第1空和第5空也是比较容易发挖出来的空。第一空是初始化第一个结点,第五空是此路不通,得回走,所以得退回。
转载请注明原文地址:https://tihaiku.com/congyezige/2410676.html

最新回复(0)