回溯法---->哈密顿环

哈密顿环

1、问题描述

设G =(V,E)是一个n 结点的连通图。一个哈密顿环是一条沿着图G 的n 条边环行的路径, 它访问每个结点一次并且返回到它的开始位置。

图G1含有一个哈密顿环1->2 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 1

2、找下一个结点的算法

过程NEXTVALUE给出了在求哈密顿环的过程中如何找下一个结点的算法。

procedure NEXTVALUE( k)

∥X(1)  , ⋯ ,  X( k - 1) 是一条有k - 1 个不同结点的路径。若X( k ) = 0 , 则表示再无结点可分配给X(k) 。若还有与X(1) , ⋯  ,X( k - 1) 不同且与X( k - 1) 有边相连接的结点, 则将其中标数最高的结点置于X(k) 。若k = n , 则还需与X(1) 相连接∥

global integer n , X( 1∶n) , boolean GRAPH (1∶n , 1∶n)

integer k , j

loop

X( k )←  (X(k) + 1) mod ( n + 1) ∥下一个结点∥

if X( k) = 0 then return endif

if GRAPH (X( k - 1 ) , X( k) ) ∥有边相连吗∥

then for j←1 to k - 1 do ∥检查与前k - 1 个结点是否相同∥

if X( j ) = X( k)

then exit ∥有相同结点, 出此循环∥

endif

repeat

if  j = k ∥若为真, 则是一个不同结点∥

then  if k < n or ( k = n and GRAPH(X( n ) , 1 ) ) then return

endif

endif

endif

repeat

end NEXTVALUE

3、找所有的哈密顿环

procedure H AMILTONIAN( k )

∥这是找出图G中所有哈密顿环的递归算法。图G用它的布尔邻接矩阵GRAP H(1∶n ,1

∶n)表示。每个环都从结点1开始

global integer X(1∶n)

local integer k , n

loop ∥生成X( k) 的值∥

call NEXTVALUE(k ) ∥下一个合法结点分配给X( k) ∥

if X( k) = 0 then return endif

if k = n

then print (X,‘1’) ∥打印一个环∥

else call H AMILTONIAN( k + 1)

endif

repeat

end HAMILTONIAN

这个过程首先初始化邻接矩阵GRAPH(1∶n ,1∶n), 然后置X(2∶n) ←0 ,X( 1) ←1 ,再执行callHAMILTONIAN( 2)。

posted on   小强斋太  阅读(343)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

导航

< 2013年5月 >
28 29 30 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示