对于无向图来说,哈密顿路径对于图每个顶点只访问一次。 哈密顿回路(或哈密顿循环)是一个哈密顿路径,并且从哈密顿路径的最后一个顶点到第一个顶点存在边缘(也就是可以回到初始位置)。 确定给定图是否包含哈密顿回路。 如果包含,则打印路径。 以下是所需功能的输入和输出。

输入:2D阵列graph[V][V](其中V是图中的顶点数,通过邻接矩阵表示)。如果从ij存在一条边,则graph[i][j]1,否则graph[i][j]0

输出:包含哈密顿回路的path[V]path[i]应该表示哈密顿回路中的第i个顶点。 如果图中没有哈密顿回路,代码也应该返回false

例如,下图中的哈密顿回路是{0,1,2,4,3,0}

(0)--(1)--(2)|   / \   ||  /   \  | | /     \ |
(3)-------(4)

并且下图不包含任何哈密尔顿回路。

(0)--(1)--(2)|   / \   ||  /   \  | | /     \ |
(3)      (4)

解题思路

最简单的思路就是,生成顶点的全排列,然后循环遍历每个排列是不是满足条件。伪代码

当存在未遍历到的组合时
{if(两个连续顶点之间有边并且最后一个顶点和初始点是相连通的)。{打印这种排列方式。break;}
}

这种算法的时间复杂度是O(n!)级别的,显然如果n较大的话,那么这种做法是不合理的。我们可以使用回溯法解决这个问题。

我们首先创建一个空的path,并且将0这个点加入其中。然后我们从1开始添加后续顶点。在添加后续顶点之前,我们首先要检查这些顶点是不是与之前添加的顶点相邻并且我们没有添加过。如果找到了这样的点的话,我们就将它添加到path中去,接着我们就要判断下一个位置的点,在此之前我们先要判断我们现在path中点的数量是不是已经是全部点的个数了,如果是的话我们要判断头结点和尾节点是不是存在边,如果存在的话,我们就输出path,如果不存在,我们就要将刚才加入的点给弹出,继续加入下一个有效点测试。

下面是回溯法解决问题的代码:

class Graph: def __init__(self, vertices): self.graph = [[0 for column in range(vertices)]\for row in range(vertices)] self.V = vertices '''Check if this vertex is an adjacent vertex  of the previously added vertex and is not  included in the path earlier '''def isSafe(self, v, pos, path): # Check if current vertex and last vertex  # in path are adjacent if self.graph[ path[pos-1] ][v] == 0: return False# Check if current vertex not already in path for vertex in path: if vertex == v: return Falsereturn True# A recursive utility function to solve  # hamiltonian cycle problem def hamCycleUtil(self, path, pos): # base case: if all vertices are  # included in the path if pos == self.V: # Last vertex must be adjacent to the  # first vertex in path to make a cyle if self.graph[ path[pos-1] ][ path[0] ] == 1: return Trueelse: return False# Try different vertices as a next candidate  # in Hamiltonian Cycle. We don't try for 0 as  # we included 0 as starting point in in hamCycle() for v in range(1,self.V): if self.isSafe(v, pos, path) == True: path[pos] = v if self.hamCycleUtil(path, pos+1) == True: return True# Remove current vertex if it doesn't  # lead to a solution path[pos] = -1return Falsedef hamCycle(self): path = [-1] * self.V ''' Let us put vertex 0 as the first vertex  in the path. If there is a Hamiltonian Cycle,  then the path can be started from any point of the cycle as the graph is undirected '''path[0] = 0if self.hamCycleUtil(path,1) == False: print("Solution does not exist")return Falseself.printSolution(path) return Truedef printSolution(self, path): print("Solution Exists: Following is one Hamiltonian Cycle")for vertex in path: print(vertex, end=' ') print(path[0])# Driver Code '''Let us create the following graph (0)--(1)--(2) |   / \   | |  /   \  | | /     \ | (3)-------(4)
'''
g1 = Graph(5)
g1.graph = [ [0, 1, 0, 1, 0], [1, 0, 1, 1, 1],  [0, 1, 0, 0, 1,],[1, 1, 0, 0, 1],  [0, 1, 1, 1, 0], ] # Print the solution
g1.hamCycle()'''
Let us create the following graph (0)--(1)--(2) |   / \   | |  /   \  | | /     \ | (3)       (4)
'''
g2 = Graph(5)
g2.graph = [ [0, 1, 0, 1, 0], [1, 0, 1, 1, 1],  [0, 1, 0, 0, 1,], [1, 1, 0, 0, 0],  [0, 1, 1, 0, 0], ] # Print the solution
g2.hamCycle()# This code is contributed by Divyanshu Mehta

reference:

https://www.geeksforgeeks.org/hamiltonian-cycle-backtracking-6/

Hamiltonian Cycle(哈密顿回路)相关推荐

  1. PAT甲级1122 Hamiltonian Cycle:[C++题解] 图论、模拟

    文章目录 题目分析 题目链接 题目分析 分析 哈密顿回路:从1个点出发,经过所有点一次,然后回到起点. 四个特点: 1)回路必须包含n+1个点:2)回路是个环,第一点和最后一个点相等:3)回路中相邻两 ...

  2. PAT A1122 Hamiltonian Cycle ——春至花如锦,夏近叶成帷

    PAT A1122 Hamiltonian Cycle 题目要求的这种cycle是一个经过了所有顶点的简单环路,应该可以理解为序列应包含N+1个元素,首尾元素相同,其余的元素只出现一次,且整条路线是能 ...

  3. 1122 Hamiltonian Cycle (25 分)【难度: 一般 / 知识点: 模拟 哈密顿回路】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805351814119424 本题考察的就是哈密顿回路 只能走n+1步 有 ...

  4. PAT甲级题目翻译+答案 AcWing(图论)

    1003 Emergency (25 分) 题意 :求无向图中最短路的数量,以及在最短路情况下,点权之和最大是多少 思路 :dijkstra的扩展一般在第三步"用t更新其它点":s ...

  5. 没有哈密瓜只有哈密顿----图论之哈密顿回路

    老规矩,先来百度一下 哈密顿图(哈密尔顿图)(英语:Hamiltonian graph,或Traceable graph)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其 ...

  6. 关于旅行商,哈密顿回路和NP问题的科普

    哈密顿回路 哈密顿图(哈密尔顿图)(英语:Hamiltonian graph,或Traceable graph)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只 ...

  7. 哈密顿回路/路径学习

    参考博客:https://blog.csdn.net/zhouzi2018/article/details/81278942 哈密顿图 哈密顿图(哈密尔顿图)(英语:Hamiltonian graph ...

  8. java实现哈密顿回路问题

    1 问题描述 什么是哈密顿回路? 引用自百度百科: 哈密顿图(哈密尔顿图)(英语:Hamiltonian path,或Traceable path)是一个无向图,由天文学家哈密顿提出,由指定的起点前往 ...

  9. 哈密顿回路 c++ dfs

    文章目录 哈密顿回路 解题思路 思路 解题代码 定义变量 数据读入 递归实现 整体代码 哈密顿回路   给定一个无向图,由指定的起点前往指定的终点,途中经过的所有其他顶点且只经过一次,成为哈密顿路径, ...

最新文章

  1. wrs-arcface虹软人脸识别
  2. 大满贯!清华学生超算团队获得国际大学生超级计算机竞赛(SC18)总冠军(附现场视频)...
  3. 【CENTOS6】ORACLE JDK7安装
  4. 收集国内著名互联网公司前端/UED部门的blog,方便学习交流
  5. Sql Server之旅——第十一站 简单说说sqlserver的执行计划
  6. C++中左移操作符的重载
  7. GET_ROLE_BASED_PAGE_USAGES
  8. java 监听本地端口_JAVA本地监听与远程端口扫描
  9. power bi 雷达图_【自助式数据分析平台——WonderBI(豌豆BI)】免费在线试用_软件库...
  10. 3.in_array低性能问题
  11. python解析GF1卫星数据.xml文件
  12. 纯C语言编程-游戏之弹跳球
  13. 算法学习的一些个人心得
  14. 设置wsl2桥接模式和设置ip
  15. java 取磁盘阵列容量_硬盘阵列 Raid 的区别及容量计算方式
  16. 算法导论 之 红黑树 - 添加[C语言]
  17. 哈勃望远镜研究员测试区块链的空间数据处理
  18. 合天网安实验室CTF-解密100-Funny Crypto
  19. xctf攻防世界 MISC高手进阶区 3-11
  20. 魏永征《向媒介侵权讨说法:媒介侵权法律问题》

热门文章

  1. 第七章:小朱笔记hadoop之源码分析-hdfs分析 第三节:hdfs实现分析
  2. pycharm代码注释支持google风格
  3. 注释及取消注释快捷键(及Google打开刚关闭网页)
  4. 当前计算机销售排名前10,中国电脑排行榜前十名 联想销量世界前列很是热销
  5. 课程笔记_CS231n_课时7_损失函数
  6. 华为ensp模拟器借助VMware虚拟机的NAT网卡实现上网
  7. 数据库标准化之CDISC
  8. 来回顾一下,当年的“发烧史”吧:
  9. Charles Petzold《Code》----2016.12.28 读1~3章
  10. 社招阿里java岗到底有多难?分享阿里社招面试真题(附答案),以及P7需要掌握的知识点总结!