哈密顿回路问题的回溯算法—算法设计技巧与分析资料文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
●哈密顿回路问题:
●解空间:
A={ (x1, x2, …, x n)| x1=1, 2<= x i<=n, i= 2, …, n} 其中,x1, x2, …, x n表示G中的顶点序列。
●解的约束条件:(设图G用邻接矩阵graph表示)
(x1, x2, …, x n)为哈密顿回路当且仅当
graph[x k-1, x k]=1, k=2, 3, …, n 且graph[x n, x1]=1且x i≠x j (i≠j)
●回溯算法:
设置一个标记数组tag[1..n]表示顶点是否在当前生成的路径上:
tag[i]=1, 顶点i在当前路径上
tag[i]=0, 顶点i不在当前路径上
注意:当一个顶点退出当前路径时,该顶点的标记应复原为0。
算法HAMILTONIAN
输入:正整数n和含n个顶点的连通图G的邻接矩阵graph。
输出:图G的所有哈密顿回路, 若无哈密顿回路则输出no solution。
x[1]=1 ; x[2..n]=0 //用x[1..n]表示搜索路径, 从顶
点1开始。
tag[1]=1; for i=2 to n tag[i]=0 //设顶点标记初值。
flag=hamilton( 2 )
if not flag then output “no solution”//输出无解end HAMILTONIAN
过程hamilton(k)
//在已得到当前路径x[1..k-1]的情况下,求图G的
所有哈密
//顿回路并输出,有解则返回true, 否则返回false。
t=false //用t标志是否有解。
for i=2 to n
x[k]=i //试将顶点i作为当前路径上的第k个顶点。
if route(k) then //当前顶点可作为当前路径的下一顶点。
tag[x[k]]=1 //当前顶点加入当前路径。
if k=n then //找到一条哈密顿回路。
t=true;output x[1..n] //输出当前找到的哈密顿回路。
else //x[1..k]是部分路径。
t1= hamilton (k+1) //递归求后面所有的
哈密顿回路
if t1 then t=true
end if
tag[x[k]]=0 //顶点x[k]退出当前路径。
end if
end for
return t
end hamilton
过程route(k)
//判断当前顶点x[k]是否可作为当前路径x[1..k-1]
的下一顶点, //是则返回true, 否则返回false。
if (graph[x[k-1], x[k]]=1)and (tag[x[k]]=0)and(k<n or k=n and graph[x[k],1]=1) then return true
else return false
end route。