算法 {哈密顿路径,哈密顿环}
算法 {哈密顿路径,哈密顿环}
@LOC_COUNTER = 2;
哈密顿路径,哈密顿环
定义
哈密顿路径;
对于一个有N个点的图(有向无向均可), 如果一条路径 经过了图中所有点1,2,...,N
恰好一次, 则该路径为哈密顿路径;
有哈密顿路径的图, 称为 半哈密顿图;
@DELI;
哈密顿环;
对于一个有N个点的图(有向无向均可), 如果一个环 经过了图中所有点1,2,...,N
恰好一次, 则该路径为哈密顿环;
有哈密顿环的图, 称为 哈密顿图;
解释
哈密顿要求的是: 经过所有点 恰好经过一次, 每个点 不可以经过 > 1 > 1 >1次;
.
比如 N = 3 N=3 N=3, 那么 1 − 2 − 1 − 3 1-2-1-3 1−2−1−3 就不是个哈密顿路径;
否则 如果点可以经过多次 那也太简单了…
对于哈密顿路径, 你可以想象成: 当你从a移动到b时, 要将a这个点(和他所有的邻接边) 全部删除掉;
.
一定不会重复经过同一条边;
对于哈密顿环, b e g − . . . − b e g beg - ... - beg beg−...−beg 你可以想象成: 当你从a移动到b时(且 a ≠ b e g a \neq beg a=beg), 要将a这个点(和他所有的邻接边) 全部删除掉 (因为是环 最终你还要回到 b e g beg beg 因此不能把起点给删除掉);
.
对于有向图, 哈密顿环一定不会重复经过同一条边;
.
对于 N = 2 N=2 N=2的无向图 哈密顿环可能会重复经过同一条边 (比如 a − b a-b a−b图, 那么 a − b − a a-b-a a−b−a是哈密顿环 同一条边经过了2次); 对于 N > 2 N>2 N>2的无向图 哈密顿环一定不会重复经过同一条边;
@DELI;
哈密顿路径 和 欧拉路径, 都是一条路径, 一个是要经过所有点一次, 一个是要经过所有边一次;
求最短哈密顿路径
定义
给定一个N(大约20)个点的图, 求以1为起点 以N为终点的 最短哈密顿路径;
题解
-{ 超时算法;
枚举所有1 - (...) - N
的路径, 这一共有 ( N − 2 ) ! (N-2)! (N−2)!条路径 会超时;
-}
MAKR: @LOC_0
;
状压DP, 0110101
表示 所有由1,3,5,6
组成的哈密顿路径 (且以1
为起点) (比如1356, 1536, 1635,...
总之每个点必须只经过一次); 再设置一个维度 来表示终点, 比如(0110101, 3)
表示一切形如1 (5,6) 3
的 路径 (中间可以是5-6
也可以是6-5
);
集合划分: 去掉当前终点后, 再枚举 他的前驱节点;
//> (1,?) 路径长度为1DP[ 1][ 0] = 0;//> ({3/5/9...}, ?) 路径长度为2for( int j = 1; j < N; ++j){int i = (1 << j) | 1;DP[ i][ j] = Edge[ j][ 0];}//> 路径长度 >= 3for( int i = 7; i < (1 << N); i += 2){if( __Tools::Get_bitCount( i) < 3) continue;for( int j = 1; j < N; ++j){if( (i >> j & 1) == 0) continue;auto & curDP = DP[ i][ j];curDP = 0x3F3F3F3F;//--auto pre = i ^ (1 << j);for( int p = 1; p < N; ++p){ // 注意这里跳过了`0`, 这就是为什么我们对*路径长度为2*的 给预处理了;if( (pre >> p & 1) == 0) continue;__Tools::Min_self_( curDP, DP[ pre][ p] + Edge[ p][ j]);}}}cout<< DP[ (1<< N) - 1][ N-1];
性质
@DELI;
MARK: @LOC_1
;
比较下: 哈密顿的状压DP 和 精确覆盖问题的状压DP;
精确覆盖问题: LINK: (https://editor.csdn.net/md/?not_checkout=1&articleId=131009658)-(@LOC_2)
;
两者有相似之处: (答案只关注[(1<<N)-1]
这个状态, 别的不在乎), (假如把哈密顿的点 当做是列, 都是要覆盖所有列 一次);
精确覆盖的状压DP, 他的cur -> nex
的递推, (令col
为cur
中 第一个0
的下标), 可以只遍历col
为1
的那些行 (不需要遍历所有行, 具体可以看上面的链接);
而这里哈密顿路径, 如果也采用cur -> nex
的递推方式, 他能否也进行这个优化呢? (即nex = cur | (1 << ind)
其中ind
为cur
中第一个0
的下标), 标准做法是 这个ind
要遍历所有的 为0
的下标;
举个例子, 00111
使用这个优化 只会更新01 111
这个状态, 也就是 10 111
这个状态 一定是非法的;
.
这在覆盖问题是没问题的, 因为最终答案11 111
可以通过00 111 -> 01 111 -> 11 111
的方式获得;
.
但是在这里, 哈密顿路径是要有次序的 即他的所有列 是有次序的, 你得不到10 111
这个状态 就意味着 一定不会得到形如(123) - (5)
这种的路径; 而答案11 111
他是跟次序有关系的, 比如答案就是1-2-3 - 5 - 4
, 那么你是得不到的;
因此, DP的优化 这还是得看DP的定义, 虽然我们知道 DP的集合元素 一定是序列 (也就是, DAG上的路径 他自然是序列), 但是 不代表 DP的定义 一定是线性的序列的, 也就是 答案 从DP本质讲 是个序列, 但是不同的DP定义 可能跟序列没有关系 这个答案序列 变成集合 也可以;
在覆盖问题, 11 111
就表示 若干个行 他们的|
操作 等于11 111
即覆盖所有的行, 比如答案是11000, 00111
这两个行, (按照上面讲的状压DP的优化) 他的答案序列 一定是[00111, 11000]
(不会是[11000, 00111]
), 但是 其实答案 跟序列没有关系, 你把他变成集合 {11000, 00111}
也是正确的;
正因为此, 即答案 跟序列的次序没有关系, 即[a,b,c], [c,b,a] [b,a,c], ...
这些序列 是等价的 (因为答案只关心序列里元素的个数), 把他们变成 统一的一个集合 {a,b,c}
是可以的 不影响答案; 因此, 才可以进行这个优化 (即00111
只更新01111
不更新10111 (这个状态实际是合法的, 但在我们的DP里 他就是非法的)
), 从而优化时间;
但是在这里 哈密顿距离, 答案跟序列的次序 是有关系的, 序列[a,b,c] [c,b,a]
代表2个不同的路径 他俩的路径长 是不一样的 (而答案就是求的路径长), 因此 你不能把他们 混成一谈{a,b,c}
, 也就不能进行那个优化了;
例题
LINK: https://www.acwing.com/problem/content/description/93/
;
算法 {哈密顿路径,哈密顿环}相关推荐
- Chu-LiuEdmonds算法之无环解析
Chu-Liu/Edmonds算法之无环解析 本篇博客是进一步介绍Chu-Liu/Edmonds算法是如何实施的. 前期介绍 该实验用的数据结构是python的嵌套字典,形如: graph = {'r ...
- 最短哈密顿环 退火_【CH0103】最短哈密顿路径
题目大意:给定一个 N 个点的无向图,点有点权,求从 0 号点走到 N-1 号点的最短哈密顿路径是多少. 题解:由于哈密顿路径的定义是每个顶点必须经过且仅能经过一次,因此,可用当前是否经过了这些点和当 ...
- *【POJ - 1860】Currency Exchange (单源最长路---Bellman_Ford算法判正环)
题干: Description Several currency exchange points are working in our city. Let us suppose that each p ...
- 【数据结构与算法】带环单链表查找环的入口算法
带环单链表的故事 @不了解前尘往事的Reader,烦请阅读--<判断单链表是否有环的算法> 如何找带环单链表的环的入口 这里只说比较可行的算法吧. 思路一:HashSet第一个重复元素就是 ...
- 分布式缓存原理——一致性hash算法(hash环)、Hash槽
一.一致性哈希算法:一种特殊的哈希算法,目前主要应用于分布式缓存当中,可以有效地解决分布式存储结构下动态增加和删除节点所带来的问题. 一致性Hash算法是对2^32取模,2^32个点组成的圆环称为Ha ...
- POJ-2438 哈密顿环 哈密瓜很甜
无向图经过所有的节点一次且仅一次:哈密瓜路径 无向图经过所有的边一次且仅一次:欧拉路径 带权哈密顿路径就是旅行商问题. 参考博客:https://blog.csdn.net/zhouzi2018/ar ...
- 【算法】约瑟夫环原理及其公式
问题描述 将n个人围成一个圈,从1开始依次数数,数到k或者k的倍数时,这个人出局,如此循环直到环中只剩一个人的时候这个人获胜 算法原理 参考文章最浅显易懂的约瑟夫环讲解_秃头哥编程-CSDN博客_约瑟 ...
- 一致性Hash算法(hash环)
一致性Hash(DHT)性质 考虑到分布式系统每个节点都有可能失效,并且新的节点很可能动态的增加进来,如何保证当系统的节点数目发生变化时仍然能够对外提供良好的服务,这是值得考虑的,尤其实在设计分布式缓 ...
- 算法-有向环和拓扑排序
有向图中包括有向无环图和有向有环图,有向图在任务调度的时候优先级限制是非常有用的,最常见的是大学的排课系统,比如说计算机操作系统的优先级高于高等数学,我们可以用图表示为计算机操作系统→高等数学,高等数 ...
最新文章
- DP_knapsack
- python如何创建函数对列表里的元素进行分类_zip()函数如何在python中遍历多个列表?...
- mvn打包的POm文件
- saltstack 主题说明
- 常用机器学习算法汇总比较(完)
- RobotStudio Smart组件创建动态夹具
- linux-bash的基本-自动补全-快捷键-历史-命令的别名
- Spring源码:ApplicationContextInitializer
- a href='NewsShow.aspx?id=%#Eval(id) %' class=red%#Eval(title) %/a页面传值
- python显示shape为(224,224,64)的图像?plt.imshow
- idea报错:Invalid bound statement (not found)
- 获取.jar文件运行时所处的路径
- 利用python调用PSS/E进行电力系统仿真
- QQ正式推出“超级QQ秀”布局元宇宙
- localstorage ie11不支持
- JS学习之BOM | 常见网页特效 | 轮播图 | 返回顶部 | 筋斗云案例
- 如何区分b ,B,KB,MB,GB?
- python将html转换成excel_Python将HTML格式文件中字段提取到EXCEL表的方法
- 2023年EasyRecovery数据恢复还会收费吗?
- 中国软件:10个人 20年坎坷路
热门文章
- 如何在图片中添加文字
- Microsoft Graph Toolkit Teams 相关
- 对于经常出现exeplorer.exe错误的问题的总结
- 苹果计算机删除可怎么恢复,苹果电脑怎么恢复垃圾桶已删除文件-万兴恢复专家...
- 计算机蓝屏故障一般在什么情况会发生,1、通过蓝屏信息找到故障根源 如果你的电脑经常遇到蓝屏的问题...
- Docker容器修改hosts文件重启不变
- McAfee, Inc. 发布的病毒专杀工具,能杀的病毒在其readme文档中
- 计算机与汉字+输入速度+云输入法,计算机与中文输入法-西安交通大学教师个人主页.PDF...
- Inventor SDK入门---API设置零件材料
- Linux操作系统的需要安装和使用