算法笔记_073:哈密顿回路问题(Java)
目录
1 问题描述
什么是哈密顿回路?
引用自百度百科:
哈密顿图(哈密尔顿图)(英语:Hamiltonian path,或Traceable path)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。在图论中是指含有哈密顿回路的图,闭合的哈密顿路径称作哈密顿回路(Hamiltonian cycle),含有图中所有顶点的路径称作哈密顿路径。
现在本文要解决的问题:给定一个图,判断这个图是否包含哈密顿回路?如果包含,输出其中一条哈密顿回路,如果不包含,则无任何输出。
2 解决方案
本文寻找哈密顿回路,运用了深度优先搜索方法,即递归和回溯法思想。
下面代码所用图数据如下:

具体代码如下:
package com.liuzhen.chapter12;
public class HamiltonCircuit {
/*
* 参数adjMatrix:给定图的邻接矩阵,其中值为1表示两个顶点可以相通,值为-1表示两个顶点不能相通
*/
public void getHamiltonCircuit(int[][] adjMatrix) {
boolean[] used = new boolean[adjMatrix.length]; //用于标记图中顶点是否被访问
int[] path = new int[adjMatrix.length]; //记录哈密顿回路路径
for(int i = 0;i < adjMatrix.length;i++) {
used[i] = false; //初始化,所有顶点均未被遍历
path[i] = -1; //初始化,未选中起点及到达任何顶点
}
used[0] = true; //表示从第1个顶点开始遍历
path[0] = 0; //表示哈密顿回路起点为第0个顶点
dfs(adjMatrix, path, used, 1); //从第0个顶点开始进行深度优先遍历,如果存在哈密顿回路,输出一条回路,否则无输出
}
/*
* 参数step:当前行走的步数,即已经遍历顶点的个数
*/
public boolean dfs(int[][] adjMatrix, int[] path, boolean[] used, int step) {
if(step == adjMatrix.length) { //当已经遍历完图中所有顶点
if(adjMatrix[path[step - 1]][0] == 1) { //最后一步到达的顶点能够回到起点
for(int i = 0;i < path.length;i++)
System.out.print(((char)(path[i] + 'a'))+"——>");
System.out.print(((char)(path[0] + 'a')));
System.out.println();
return true;
}
return false;
} else {
for(int i = 0;i < adjMatrix.length;i++) {
if(!used[i] && adjMatrix[path[step - 1]][i] == 1) {
used[i] = true;
path[step] = i;
if(dfs(adjMatrix, path, used, step + 1))
return true;
else {
used[i] = false; //进行回溯处理
path[step] = -1;
}
}
}
}
return false;
}
public static void main(String[] args) {
HamiltonCircuit test = new HamiltonCircuit();
int[][] adjMatrix = {{-1,1,1,1,-1,-1},
{1,-1,1,-1,-1,1},
{1,1,-1,1,1,-1},
{1,-1,1,-1,1,-1},
{-1,-1,1,1,-1,1},
{-1,1,-1,-1,1,-1}};
test.getHamiltonCircuit(adjMatrix);
}
}
运行结果:
a——>b——>f——>e——>c——>d——>a
参考资料:
2.《算法设计与分析基础》第3版 Anany Levitin 著 潘彦 译
算法笔记_073:哈密顿回路问题(Java)的更多相关文章
- 算法笔记_018:旅行商问题(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 减治法 2.2.1 Johson-Trotter算法 2.2.2 基于字典序的算法 1 问题描述 何为旅行商问题?按照非专业的说法,这个问 ...
- 算法笔记_019:背包问题(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 减治法 2.2.1 递归求解 2.2.2 非递归求解(运用异或运算) 2.3 动态规划法 1 问题描述 给定n个重量为w1,w2,w3,... ...
- 算法笔记_015:快速排序(Java)
目录 1 问题描述 2 解决方案 2.1 快速排序原理简介 2.2 具体编码 1 问题描述 给定一组数据,使用快速排序得到这组数据的非降序排列. 2 解决方案 2.1 快速排序原理简介 引用自百度百科 ...
- 算法笔记_230:运动员分组(Java)
目录 1 问题描述 2 解决方案 1 问题描述 有N个人参加100米短跑比赛.跑道为8条.程序的任务是按照尽量使每组的人数相差最少的原则分组.例如:N=8时,分成1组即可.N=9时,分成2组:一组 ...
- 算法笔记_136:交替字符串(Java)
目录 1 问题描述 2 解决方案 1 问题描述 输入三个字符串s1.s2和s3,判断第三个字符串s3是否由前两个字符串s1和s2交错而成且不改变s1和s2中各个字符原有的相对顺序. 2 解决方案 ...
- 算法笔记_010:插入排序(Java)
1 问题描述 给定一组数据,使用插入排序得到这组数据的非降序排列. 2 解决方案 2.1 插入排序原理简介 引用自百度百科: 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求 ...
- 算法笔记_039:杨辉三角形(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数. 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加. ...
- 算法笔记_041:寻找和为定值的多个数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 输入两个整数n和sum,要求从数列1,2,3,...,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来. 2 解决方案 上述问题 ...
- 学习Java 以及对几大基本排序算法(对算法笔记书的研究)的一些学习总结(Java对算法的实现持续更新中)
Java排序一,冒泡排序! 刚刚开始学习Java,但是比较有兴趣研究算法.最近看了一本算法笔记,刚开始只是打算随便看看,但是发现这本书非常不错,尤其是对排序算法,以及哈希函数的一些解释,让我非常的感兴 ...
随机推荐
- python3 2017.3.19
今天弄了一个晚上没弄出来一个小东西,只弄出来了写追加,而且还是笨方法,起码死不掉那种. global log 127.0.0.1 local2 daemon maxconn 256 log 127.0 ...
- 记一次Python爬虫开发经历
为啥要做Python爬虫,是因为我去找电影的某个网站有点坑,它支持tag标签查询自己喜欢的电影,但是不支持双标签或者三标签查询.由于一个电影对应多种类型(tag),这就意味着,我需要进入这个电影介绍界 ...
- logging模块介绍
在我们的实际开发过程中,我们有时候需要记录一些重要操作,或者程序运行情况,我们就需要在程序里面写入日志,来达到更快的排错跟记录重要操作的目的.在Python中logging模块就很好的解决了这个问题, ...
- Poj2182 Lost Cows(玄学算法)
题面 Poj 题解 不难发现最后一位就是\(pre[n]+1\),然后消除这个位置对其他位置的贡献,从左到右扫一遍,必定有至少一个位置可以得出,循环这个过程,\(O(n^2)\)出解. #includ ...
- 【DFS】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem D. Divisibility Game
题意:给你一个序列,长度不超过52,每个元素不超过13.让你重新对这个序列排序,sum(i)表示i的前缀和,使得排序过后,对每个i,都有sum(i)%i==0. 深搜,加两个优化:①倒着从后向前搜:② ...
- 关于abstract class 和 interface
1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系.但是,一个类却可以实现多个interface. 2.在abstract class 中可以有自己 ...
- The Responsive jQuery Content Slider
jquery slider 效果 http://bxslider.com/ http://www.cnblogs.com/lhb25/archive/2012/08/13/jquery-image-e ...
- 解决eclipse中java代码注释变成乱码的问题
Eclipse JAVA文件注释乱码将别人的项目或JAVA文件导入到自己的Eclipse中时,常常会出现JAVA文件的中文注释变成乱码的情况,主要原因就是别人的IDE编码格式和自己的Eclipse编码 ...
- bcp功能
#include "MyBCP.h" #include "odbcss.h" //1,Allocate an environment handle and a ...
- JavaScript 开发的45个技巧2
http://mp.weixin.qq.com/s?src=3×tamp=1474692926&ver=1&signature=agI3W5rKmVC6GgbdTXh ...