参考博客:https://blog.csdn.net/zhouzi2018/article/details/81278942

哈密顿图

哈密顿图(哈密尔顿图)(英语:Hamiltonian graph,或Traceable graph)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。在图论中是指含有哈密顿回路的图,闭合的哈密顿路径称作哈密顿回路(Hamiltonian cycle),含有图中所有顶点的路径称作哈密顿路径(Hamiltonian path)。有哈密顿路径但没有哈密顿回路的图叫做半哈密顿图

求哈密顿回路/路径已经被证明为NP-C问题,只能通过暴力枚举求。但有些定理还是应该知道的。

判定:

一:Dirac定理(充分条件)

设一个无向图中有N个顶点,若所有顶点的度数大于等于,则哈密顿回路一定存在.

二:基本的必要条件

设图G=<V, E>是哈密顿图,则对于v的任意一个非空子集S,若以|S|表示S中元素的数目,G-S表示G中删除了S中的点以及这些点所关联的边后得到的子图,则W(G-S)<=|S|成立.其中W(G-S)是G-S中联通分支数.

三:竞赛图(哈密顿通路)

N阶竞赛图:含有N个顶点的有向图,且每对顶点之间都有一条边.对于N阶竞赛图一定存在哈密顿通路.

N(N>=2)阶竞赛图一点存在哈密顿通路.

其它定理:

(1)若图的最小度不小于顶点数的一半,则图是哈密顿图; 

(2)若图中每一对不相邻的顶点的度数之和不小于顶点数,则图是哈密顿图。 

(3)范定理:若图中每对距离为2的点中有一点的度数至少是图的点数的一半,则该图存在哈密尔顿圈。

例1、HDU - 2181   哈密顿绕行世界问题 (求哈密顿回路)

题意:按字典序输出指定起点的哈密顿回路。

思路:爆搜。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define LL long long
using namespace std;
int book[25],path[25],cnt;
int map[25][4];
void dfs(int ex,int x,int step)
{path[step]=x;if(step==21){if(x==ex){printf("%d: ",++cnt);for(int i=1;i<=21;i++)printf(" %d",path[i]);printf("\n");         }return ;}for(int i=0;i<3;i++){if(step==20&&map[x][i]==ex)dfs(ex,map[x][i],step+1);if(!book[map[x][i]]){book[map[x][i]]=1;dfs(ex,map[x][i],step+1);book[map[x][i]]=0;}    }}
int main()
{for(int i=1;i<=20;i++){for(int j=0;j<3;j++)scanf("%d",&map[i][j]);sort(map[i],map[i]+3);       }int m;while(~scanf("%d",&m)){if(m==0) break;cnt=0;memset(book,0,sizeof(book));book[m]=1;dfs(m,m,1);} return 0;
}

例2、HDU - 3538  A sample Hamilton path (求哈密顿路径)

题意:求从0开始的最短哈密顿路径,有m个限制条件,限制条件为a、b,表示走b之前必须先走a。

思路:爆搜肯定不行了,不过最多21个点,考虑状压dp。

dp[st][u]:表示之前走过st这个状态代表的所有点后,以u为终点时的最短路。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = (1<<21)+10;
const int inf = 0x3f3f3f3f;
int mp[110][110],dp[N][110],f[110];
int n,m,u,v,ans,nn;
//dp[st][u]:表示之前走过st这个状态代表的所有点后,以u为终点时的最短路
int main(void)
{while(~scanf("%d%d",&n,&m))  {nn=(1<<n);for(int st=0;st<nn;st++)for(int i=0;i<n;i++)dp[st][i]=inf;   for(u=0;u<n;u++){f[u]=0;for(v=0;v<n;v++)   scanf("%d",&mp[u][v]);} for(int i=1;i<=m;i++)scanf("%d%d",&u,&v),f[v]|=(1<<u);        dp[1][0]=0;for(int st=0;st<nn;st++)for(u=0;u<n;u++){if(dp[st][u]==inf) continue; for(v=0;v<n;v++){//u这个点必须已经走过,v这个点必须没有走过,走v之前必须走的点必须都走过,u能到达v if(!(st&(1<<u))||(st&(1<<v))||((st&f[v])!=f[v])||mp[u][v]==-1) continue;dp[st|(1<<v)][v]=min(dp[st|(1<<v)][v],dp[st][u]+mp[u][v]);           }   }ans=inf;for(u=0;u<n;u++)ans=min(dp[nn-1][u],ans);  if(ans==inf) puts("-1");elseprintf("%d\n",ans);}return 0;
}

哈密顿回路/路径学习相关推荐

  1. (pytorch-深度学习系列)pytorch实现自定义网络层,并自设定前向传播路径-学习笔记

    pytorch实现自定义网络层,并自设定前向传播路径-学习笔记 1. 不包含模型参数的自定义网络层 首先我们自定义一个网络层, 定义一个网络层,使其不包含模型参数,并在forward()函数中进行运算 ...

  2. 【嵌入式】超详细的嵌入式路径学习精选合集,建议收藏

    超详细的嵌入式路径学习精选合集,纯干货,建议收藏! 本合集归类汇总了嵌入式开发技术相关的学习路径.知识与经验总结,以及一些源码.资料分享等.将其分类列出目录,一来为了避免有些知识长时间不用,会很容易忘 ...

  3. 盘阵多路径学习(转)

    一.什么是多路径 普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系.而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存储通过了光纤交换机或者多块网卡及IP来 ...

  4. 网站架构设计发展路径学习

    1.系统概况图 图1.1 系统架构概况图 图1.2 较为完整的系统架构图 2.系统使用的主要技术 下列排名不分先后 2.1前端 JavaScript,html,css,silverlight,flas ...

  5. inno setup 更改安装路径学习

    因为安装的时候,常常需要修改安装文件路径,因此需要这个功能 VAR button_browse : HWND; 界面: //浏览按钮   button_browse := BtnCreate(Wiza ...

  6. mac 部署php项目路径,学习猿地-Mac 使用 Valet 花式部署 PHP 项目

    我相信绝大部分人可能只知道 Valet 可以用来轻松部署 Laravel 项目.但一定极少人知道,Valet 也可以用来部署 PHP 其他框架的项目.我真心懒得每次都要屁颠屁颠地去 Vagrant 里 ...

  7. android 本地存储路径,Android本地存储路径学习

    一.前言: Android 中获取本地储存路径,有四个方法, getCacheDir().getFilesDir().getExternalFilesDir().getExternalCacheDir ...

  8. 自然语言系列学习之表示学习与知识获取(七)利用关系路径进行关系抽取

    接下来介绍另外一个方向是如何更好的利用知识图库里关系路径的信息进行关系抽取. 有一个非常直观的例子介绍关系路径的好处,如电影阿甘正传(上图),我们如果想要知道阿甘正传的语言是什么,可以通它的电影导演是 ...

  9. 免费领,自动化控制编程入门到开挂学习路径(附教程和软件工具)

    大家好,我是华山自控编程的朱老师,很多同学都在讨论上位机运动控制卡与机器视觉编程的问题,今天写了干货,希望可以帮助到你们! 一.入门上位机编程的疑问解答 1.自动化控制编程分哪几个方向? 答:自动化控 ...

最新文章

  1. 打分矩阵Scoring Matrices
  2. java list反序列化_java序列化与反序列化操作实例分析
  3. python【数据结构与算法】计数问题(分治)
  4. 腾讯Android自动化测试实战3.3.3 修改Robotium以支持X5WebView
  5. bootstrap-suggest插件处理复杂对象时的解决方案
  6. java linq select_Java 8是否还需要LINQ?还是已经比LINQ 更好?
  7. 英特尔固态硬盘测试软件,SSD固态硬盘检测测试软件(Intel SSD Toolbox)
  8. 遥控器终结者——万能红外遥控器开发方案详解来了!
  9. 斗地主牌型判断实现(二)
  10. 计算机网络基础知识教案模板,网络技术应用教案模板
  11. iOS 【真机调试-免证书-开发者信任问题】
  12. 开盘跳空是否透露超额收益?A股跳一跳因子挖掘
  13. 神经元的结构示意图手绘,神经元的结构图手绘
  14. Anaconda 更换浏览器要求输入token
  15. react的useMemo 和 vue3的computed
  16. Php 领域驱动 视频,.Net DDD 领域驱动学习视频教程
  17. 基于不同IP地址下的虚拟主机配置以及基于不同端口下的虚拟主机配置
  18. 2022年索尼A7R4A与A7R3A如何选择?
  19. 《程序员的自我修养》后感【1】
  20. 超导材料应用于量子计算机,Nature子刊:超导超材料有望助力量子计算机的实现...

热门文章

  1. java自动生成 rap接口_GitHub - XiaoweiM/rap2-javabean: rap2生成javabean
  2. mysql ident current_sql server 2000 @@IDENTITY和SCOPE_IDENTITY和IDENT_CURRENT的区别
  3. 阿里腾讯京东三巨头手握保险牌照 互联网保险要迎来发展春天了吗?
  4. SpringBoot+CXF发布Webservice时报错:counts of IllegalAnnotationExceptions
  5. 深度学习模型部署的几种方法
  6. 基于C#的AE二次开发之地图标注
  7. 大数据(二)大数据存储
  8. 一场5G毫米波引爆的频带战争
  9. 2022-2028年全球啤酒保鲜机行业收入年复合增长率CAGR为 3.9%
  10. 基于STM32F407 直播声卡实现的简易教程--音频效果篇