目录

1 问题描述

2 解决方案

 


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

参考资料:

1.基于回溯法寻找哈密顿回路

2.《算法设计与分析基础》第3版   Anany Levitin 著  潘彦 译

算法笔记_073:哈密顿回路问题(Java)的更多相关文章

  1. 算法笔记_018:旅行商问题(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 减治法 2.2.1 Johson-Trotter算法 2.2.2 基于字典序的算法   1 问题描述 何为旅行商问题?按照非专业的说法,这个问 ...

  2. 算法笔记_019:背包问题(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 减治法 2.2.1 递归求解 2.2.2 非递归求解(运用异或运算) 2.3 动态规划法 1 问题描述 给定n个重量为w1,w2,w3,... ...

  3. 算法笔记_015:快速排序(Java)

    目录 1 问题描述 2 解决方案 2.1 快速排序原理简介 2.2 具体编码 1 问题描述 给定一组数据,使用快速排序得到这组数据的非降序排列. 2 解决方案 2.1 快速排序原理简介 引用自百度百科 ...

  4. 算法笔记_230:运动员分组(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 有N个人参加100米短跑比赛.跑道为8条.程序的任务是按照尽量使每组的人数相差最少的原则分组.例如:N=8时,分成1组即可.N=9时,分成2组:一组 ...

  5. 算法笔记_136:交替字符串(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 输入三个字符串s1.s2和s3,判断第三个字符串s3是否由前两个字符串s1和s2交错而成且不改变s1和s2中各个字符原有的相对顺序. 2 解决方案 ...

  6. 算法笔记_010:插入排序(Java)

    1 问题描述 给定一组数据,使用插入排序得到这组数据的非降序排列. 2 解决方案 2.1 插入排序原理简介 引用自百度百科: 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求 ...

  7. 算法笔记_039:杨辉三角形(Java)

    目录 1 问题描述 2 解决方案 1 问题描述 问题描述 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数. 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加. ...

  8. 算法笔记_041:寻找和为定值的多个数(Java)

    目录 1 问题描述 2 解决方案 1 问题描述 输入两个整数n和sum,要求从数列1,2,3,...,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来. 2 解决方案 上述问题 ...

  9. 学习Java 以及对几大基本排序算法(对算法笔记书的研究)的一些学习总结(Java对算法的实现持续更新中)

    Java排序一,冒泡排序! 刚刚开始学习Java,但是比较有兴趣研究算法.最近看了一本算法笔记,刚开始只是打算随便看看,但是发现这本书非常不错,尤其是对排序算法,以及哈希函数的一些解释,让我非常的感兴 ...

随机推荐

  1. 推荐Maven的两个仓库

    概述 推荐两个maven的仓库,可用于查找依赖,下载jar包. 正文 mvnrepository 这个仓库用来检索依赖.下载jar包:网址:http://mvnrepository.com/ 仓库的主 ...

  2. java 反射 获取Class对象的三种方式

    String str="hello world"; //方式一 :通过对象的getClass()方法 Class<?> clazz1 =str.getClass(); ...

  3. 【DFS】Anniversary Cake

    [poj1020]Anniversary Cake Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17203   Accep ...

  4. BZOJ 4443 [Scoi2015]小凸玩矩阵(二分答案+二分图匹配)

    [题目链接]http://www.lydsy.com/JudgeOnline/problem.php?id=4443 [题目大意] 从矩阵中选出N个数,其中任意两个数字不能在同一行或同一列 求选出来的 ...

  5. 【计算几何】【圆反演】计蒜客17314 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 G. Finding the Radius for an Inserted Circle

    题意:给你三个半径相同的圆,它们切在一起,然后让你往缝里一个一个地塞圆,问你塞到第k个的半径是多少. 就把上面那两个圆的切点当成反演中心,然后会反演成这个样子,两个平行直线和一个圆. 然后就是往那个圆 ...

  6. 【BFS】【并查集】【Tarjan】【LCA】Gym - 101173H - Hangar Hurdles

    给你一张地图,给你q次询问,每次问你从A点到B点,最大能移动多大的箱子. 把每个点所能容纳的最大箱子求出来(BFS,八连通,一开始将所有边界点和障碍点入队).然后从大到小排序.然后用并查集将相邻(四联 ...

  7. 浅析HashMap和Hashtable的区别

    HashMap和Hashtable两个类都实现了Map接口,二者保存键值对(key-value对): HashMap和HashTable区别 第一,继承的父类不同.HashMap继承自Abstract ...

  8. 【MySQL笔记】解除输入的安全模式,Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Queries and reconnect.

    Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE tha ...

  9. maven 创建web工程,spring配置文件找不到!

    公司项目用的maven,在启动服务器的时候,出现上面的错误,然后找到WEB-INF下面的web.xml,给classPath加上*号,解决!

  10. 通过pl/sql计算程序的运行时间

    在sqlplus中运行sql语句或者pl/sql的时候如果需要统计运行的时间,只需要开启set timing on选项即可. SQL> set timing onSQL>SQL> s ...