哈密顿回路

哈密顿回路是图论中的一个重要概念,源于天文学家哈密顿的研究,指从特定起点出发,途径图中所有顶点一次并回到起点的路径。这类问题在图论中属于NP完全,至今没有有效算法能解决所有情况。本文探讨了哈密顿回路的定义、由来以及相关算法,包括哈密顿图、半哈密顿图和如何通过递归回溯算法寻找哈密顿环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哈密顿图(哈密尔顿图)(英语:Hamiltonian graph,或Traceable graph)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。在图论中是指含有哈密顿回路的图,闭合的哈密顿路径称作哈密顿回路(Hamiltonian cycle),含有图中所有顶点的路径称作哈密顿路径(Hamiltonian path)。

由来

 

哈密顿回路

天文学家哈密顿(William Rowan Hamilton) 提出,在一个有多个城市的地图网络中,寻找一条从给定的起点到给定的终点沿 途恰好经过所有其他城市一次的路径。

这个问题和著名的七桥问题的不同之处在于,过桥只需要确定起点,而不用确定终点。哈密顿问题寻找一条从给定的起点到给定的终点沿 途恰好经过所有其他城市一次的路径

算法

哈密顿路径问题在上世纪七十年代初,终于被证明是“NP完全”的。据说具有这样性质的问题,难于找到一个有效的算法。实际上对于某些顶点数不到100的网络,利用现有最好的算法和计算机也需要比较荒唐的时间(比如几百年)才能确定其是否存在一条这样的路径。

从图中的任意一点出发,路途中经过图中每一个结点当且仅当一次,则成为哈密顿回路。

要满足两个条件:

⒈封闭的环

⒉是一个连通图,且图中任意两点可达

经过图(有向图或无向图)中所有顶点一次且仅一次的通路称为哈密顿通路。

经过图中所有顶点一次且仅一次的回路称为哈密顿回路。

具有哈密顿回路的图称为哈密顿图,具有哈密顿通路但不具有哈密顿回路的图称为半哈密顿图。

平凡图是哈密顿图。

生成下一个结点,代码如下:

void NextValue(int k) {
//X(l),…,X(k-1)是一条有k-l个不同结点的路径。若X(k)=0,则表示再无结
//点可分配给X(k)。若还有与X(1),…,X(k-1)不同且与X(k-1)有边相连结的
//结点则将其中标数最高的结点置于X(k)。若k=n,则还需与X(1)相连结。
int n,X[n];bool Graph[n][n]; // n、X[n]定义成全局变量
int k,j;
while(1) {
X[k]=(x[k] + 1) mod (m+1) //下一个结点
if(X[k]==0) { return;}
if(Graph[X[k-1]],X[k]) { //有边相连吗
for(j=1;j<=k-1;++j) { //检查与前k-1个结点是否相同
if(X[j]==X[k]) break; //有相同结点,出此循环
};//for
if(j==k) { //若为真,则是一个不同结点
if((k<n) or (k==n and Graph[X[n]],[1] ) return;
};//if
};//if
}//while
}//NextValue

使用过程NextValue和将递归回溯算法细化得到算法Hamiltonian。此算法可找出所有的哈密顿环。

 

找所有的哈密顿环,代码如下:

void Hamiltonian(int k) {
//这是找出图G中所有哈密顿环的递归算法。图G用它的布尔邻接矩阵
//Graph(1..n,1..n)表示。每个环都从结点 1开始。
int X[n]; //X[n]定义成全局变量
int k,n;
while(1) { //生成X(k)的值
NextValue(k); //下一个合法结点分配给X(k)
if(x[k]==0) return;
if(k==) { print(X,’1’);} //打印一个环
else { Hamiltonian(k+1)}
//if
}//repeat
}//Hamiltonian

 这个过程首先初始化邻接矩阵Graph(l..n,l..n),然后置X(2:n)=0,X(l)=l,再执行Hamiltonian(2)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值