(1)问题描述:
哈密顿回路的定义: G=(V,E)是一个图,若G中一条路径通过且仅通过每一个顶点一次,称这条路径为哈密顿路径。若G中一个回路通过且仅通过每一个顶点一次,称这个环为哈密顿回路。若一个图存在哈密顿回路,就称为哈密顿图。(提示:测试集可以随机构建顶点集和边集)
(2)设计数据结构:
图采用邻接矩阵arc[n][n]存储
数组x[n]存储哈密顿回路上的顶点
数组visited[n]存储顶点的访问状态,visited[i]=1表示哈密顿回路经过顶点i
(3)针对示例图,画图并描述搜索、剪枝与回溯过程:
在解空间树从根结点1开始搜索,将x₁置为1,到达结点2,表示哈密顿回路从顶点1开始。
将x₂置为1,到达结点3,但顶点1重复访问,搜索结点2的兄弟子树,将x₂置为2,构成哈密顿回路的部分解(1,2)。
在经过结点5和结点6的试探后,将x₃置为3,构成哈密顿回路的部分解(1,2,3)。 在经过结点8、结点9和结点10的试探后,将x₄置为4,将哈密顿回路的部分解扩展到(1,2,3,4)。
在经过结点12、结点13、结点14和结点15的试探后,将x₅置为5,将哈密顿回路的部分解扩展到(1,2,3,4,5),但是从顶点5到顶点1没有边,引起回溯;将x₄置为5,到达结点17,构成哈密顿回路的部分解(1,2,3,5)。
在经过结点18、结点19和结点20的试探后,将x₅置为4,将哈密顿回路的部分解扩展到(1,2,3,5,4),由于从顶点4到顶点1存在边,找到一条哈密顿回路(1,2,3,5,4),搜索过程结束。
(4)设计算法伪码或画流程图:
(5)测试程序:
输入样例: 请输入顶点数:5
请输入邻接矩阵:
0 1 0 1 0
1 0 1 1 1
0 1 0 1 1
1 1 1 0 1
0 1 1 1 0
输出样例: 哈密顿回路为:1 2 3 5 4
(6)时间复杂性、空间复杂性:
时间复杂性是O(n!),空间复杂性是 O(n)