A逐点循环递归法求哈密顿回路
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
逐点循环递归法求哈密顿回路
王彦祺
(石家庄经济学院信息工程系,河北石家庄 050031)
摘要:本文给出求解任意图的所有哈密顿回路算法,即“逐点循环递归算法”,用于处理复杂的“旅行商问题”,证明一个图是否是哈密顿图等。在算法中,给出一个“结点标号数组”,用于存储一个回路;还给出一个无向图的正向表,用于存储初始图。
关键词:哈密顿回路,算法,无向图正向表,结点标号数组, 递归。
An Algorithm of Cycle and Recursion by Every Vertex
for Getting Hamilton Cycle
Wang Yanqi
(Department of Information Engineering, Shijiazhuang University of Economics,Shijiazhuang,Hebei 050031)
Abstract: This paper gives out an algorithm of getting all Hamilton cycle from a common graph,that is "an algorithm of cycle and recursion by every vertex", which can solve complex "travelling salesman problem ",prove that a graph is Hamilton graph or not, and so on. In algorithm, I give out a "array of signed vertex ",for storing a cycle, and a "positive direction table for non-directed graph ",for storing a given graph.
Key Words: Hamilton cycle, algorithm, array of signed vertex, positive direction table for non-directed graph, recursion.
1.问题的提出
1)任给定一个无向图,如何求无向图的哈密顿图的回路,首先必须判断该图是否是哈密顿图。如果图很复杂又有哈密顿图回路,用手工是很难找到的,该算法很容易找到任何图的所有哈密顿回路,如果一条也找不到,即证明了该图不是哈密顿图。
2) 在求解“旅行商问题”时,考虑的是带权完全无向图,“分支定界法”只是求出最小的哈密顿回路,对于任意图是不可行的。
3) 在求解“旅行商问题”时,有时只求出路径最小的哈密顿回路不一定是最佳的哈密
顿回路。因为在旅行时,所考虑的不仅仅是费用或旅程,比如,有的路线虽短,但路线人员拥挤,如果单纯按最小的哈密顿回路旅行是不现实的,反而费用更高。此时求出若干最小的哈密顿回路,甚至求出所有的哈密顿回路,才能正确的决策旅行路线。
4)如果按边的组合方法,则运算次数将是极大的,本文给出求解一般图的所有哈密顿回路的“按结点循环递归算法”。
5)本文约定,H代表哈密顿,hn代表图的结点数,hm代表图的边数。
2.算法的依据.
2.1 有关的定理
定理 1. H回路中的每一个结点的度数d H(v)必是2 ,反之不成立。
证明:H回路的结点度数必是2。反之不成立,如图 1所示, 共7个结点,7个边,每个结点的度数为2,但不是H回路。当回路的边数不到结点数,我们称为“局部回路”。当回路的边数等于结点数hn,即为“哈密顿回路”。
v3 v4
图 1
定理2. 任何无向图的回路,如果结点号和数组下标一一对应,可采用一维数组存储,结
点标号为数组下标号,也是边的起点, 该下标的数组元素的值是边的终点标号,也是下一个
边的起点下标。(本文称为“结点标号数组”)。
证明:(构造法)首先将无向图的结点按连续的自然数编号,使结点号和数组下标号是一一
对应;因为是回路,每一个结点号在回路中必出现两次,且保证回路中的边的第一个结点的
标号(下标)不重复及第二个结点的标号(数组元素值)不重复。因为是简单图,下标号和
该下标的数组元素值一定是不同的,下标号为边的起点,该下标号下的数组元素值是该边的
终点,又是下一个边的起点下标。不妨令回路的结点数为4,其中一个H 回路的边为 {(1,2),(2,4),(4,3),(3,1)}, 即1---2---4---3---1,请看表1。结点下标数组存储H 回
路的优点是即节省空间,又便于边的连接,特别是更易于编程。如果结点下标数组包含图的
所有结点,则该回路为哈密顿回路。
表 1
定理3. 如果图G=(V,E)有n 个结点(m>=n),有n 条不同的边的组合,且结点的度数均为
2,如果按定理2的方法存储,从数组下标1开始,,将下标1的数组元素值作为下一个下标,,
再取元素值,直至元素值为1止。如果此时边计数k 等于n,则该k 条边的组合,即是一条H
回路;否则,该k 条边是个“局部回路”。
证明:显然。证明略。请看图1。
2..2 存储结构
1) 初始图的存储结构. 首先将图的结点按度数由大到小重新编号为1,2,3…,即最小号,度数最大,采用无向图的正向表存储。既结点i 的后继结点(终点号)只能是大于i,从而保证边的不重复。特点是,第一个结点的后继必然大于等于2,最后一个结点的后继必然为0,而其它结点的后继必然大于等于1(如果为0,将出现割点,不可能有H 回路)。第一个结点的度数最大是必须的,因为循环递归从第一个结点(标号为1)开始,作为第一个起始标号,必
须在终点数组中至少存在两个终点,组合构成两个边。而其它起始标号,边的构成复杂,首
先必须逐一的按一个结点构成一条边加入HC 回路数组。如果将结点度数大的放在中间,将
大大增加循环递归次数。 如图2 所示,是一个无向图,有6个结点,11条边,按无向图的
正向表的存储结构,请看表 2。一个边的起点一维数组A ,下标和结点号一一对应。每一个
下标的元素值是边的该起点的后继(第一个终点)在终点一维数组B 的地址(下标号)。最
后一个结点的元素值是m+1;该图为12(不作为地址,只用于计算上一个结点的终点数)。一
个边的终点一维数组B ,下标只是起地址作用,下标的元素值是边的终点标号。
表 2
1 2
6 3
5 4
图 2