关于Hamilton问题的研究
关于Hamilton问题的研究
首先介绍一下Hamilton问题:哈密顿问题寻找一条从给定的起点到给定的终点沿途恰好经过所有其他结点一次的路径。(摘自百度百科)
从刚开始学OI买了信息学一本通,这个问题就常常出现.由于它题面的简洁性,看起来无比优美的性质和欧拉回路的高度相似性,它看起来很像一个好算法,可惜,这是一个NP-hard问题.
首先介绍一下一种正确做法:状压dp.就是用$vis[i]$表示目前走过的点的状态为$i$,找到答案后倒着回溯回去输出方案,当然搜索也是可以的,总之都是指数级算法了.
但是它有很多的不正确做法,看起来都很有道理,那么这篇文章就来介绍两种并且指出其中的问题.
首先看这样一道题:单词游戏
给定$n$个单词,求一种排列顺序使得相连单词首尾相接.$n<=10^5$
这道题有两种解法:
1.将单词作为点,如果两个单词可以首尾相接,那么连一条边,要求不重复的经过每一个点,是一个哈密尔顿路问题,于是这就得到了一个非常优秀的$2^{10^5}\times 10^5$的做法!
2.将字母作为点,对于每个单词,将它的尾字母向首字母连边,要求不重复的经过每一条边,是一个欧拉路问题,于是这就得到了一个更加优秀的$10^5$的做法!
这道题深刻的阐述了建图策略对于时间复杂度的影响,然而...这两种建图的复杂度都不是很高,如果可以设法进行一番逆变换,把一个普通图的哈密尔顿路转化为这个问题,再转化为欧拉路做,可以吗?
事实上这是没有什么问题的,但是这种逆变换也无法在多项式时间内出解,所以总复杂度还是得不到保证。
今天学习网络流的时候又看到了一种新的错误解法:
使用无源汇上下界网络流,对于每个点进行拆点限制流量上下界均为为1,对于原有的边下界为0上界正无穷.
网络流的复杂度是多项式级别的,如果这个做法是正确的,那么就可以解决哈密尔顿问题。可惜这个算法也是错误的,下面来说明一下:
首先这种算法可能会把明明不符合条件的图也判断成满足条件,为什么?
因为解决无源汇问题时,往往是通过转化为多源多汇再进一步转化为超级源汇来解决的,所以求出的可能不是一条路,而是多条路,举个最显然的例子:点数大于一但没有边的图。
事实上哈密尔顿回路已被证明是没有多项式解法的,但是对于它的思考还是很有意义的.
哈密尔顿问题虽然没有得到完美的解决,但是通过科学家们的研究,发现了一些充分条件和必要条件:
1.如果一个图中有哈密尔顿回路,那么从这个图中删去x个点,新图中的连通分量不会超过$x$个;(必要)
2.如果一个图中有哈密尔顿通路,那么从这个图中删去x个点,新图中的连通分量不会超过$x+1$个;(必要)
3.Ore定理:如果对于一个无向简单图,任意不相邻两点的度数和大于等于n,那么这个图存在哈密尔顿回路(充分);
4.如果对于一个无向简单图,任意不相邻两点的度数和大于等于n-1,那么这个图存在哈密尔顿通路(充分);
---shzr
关于Hamilton问题的研究的更多相关文章
- unity中camera摄像头控制详解
目录 1. 缘起 2. 开发 2.1. 建立项目 2.2. 旋转 2.2.1. 四元数 2.3. 移动 2.3.1. 向量操作 2.4. 镜头拉伸 2.5. 复位 2.6. 优化 1 缘起 我们的产品 ...
- 闲来无聊,研究一下Web服务器 的源程序
web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...
- SQLSERVER聚集索引与非聚集索引的再次研究(上)
SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...
- 深入研究Visual studio 2017 RC新特性
在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...
- 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践
提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- SQLSERVER聚集索引与非聚集索引的再次研究(下)
SQLSERVER聚集索引与非聚集索引的再次研究(下) 上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 ...
- 开源Word读写组件DocX 的深入研究和问题总结
一. 前言 前两天看到了asxinyu大神的[原创]开源Word读写组件DocX介绍与入门,正好我也有类似的自动生成word文档得需求,于是便仔细的研究了这个DocX. 我也把它融入到我的项目当中并进 ...
- 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)
前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...
随机推荐
- JavaWeb学习 (六)————Servlet(二)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- 使用WPF教你一步一步实现连连看(一)
第一步: 问题,怎样动态的建立一个10*10的grid(布局) for (int i = 0; i < 10; i++) { RowDefinition rowDef = new RowDefi ...
- ExtJS中xtype一览
基本组件: xtype Class 描述 button Ext.Button 按钮 splitbutton Ext.SplitButton 带下拉菜单的按钮 cycle Ext.CycleButton ...
- Mybatis获取插入记录的自增长ID
转自:http://blog.csdn.net/tolcf/article/details/39035259 1.在Mybatis Mapper文件中添加属性“useGeneratedKeys”和“k ...
- switch case语句中能否作用在String,long上
在之前的eclipse中使用switch的case语句时是只能为(byte,short,char)int类型或枚举类型.但在jdk1.7以后 在case语句中是可以使用String 以及long 等类 ...
- 10个JavaScript难点
译者按: 能够读懂这篇博客的JavaScript开发者,运气不会太差... 原文: 10 JavaScript concepts every Node.js programmer must maste ...
- 51Nod 最小公倍数之和V3
这题公式真tm难推……为了这题费了我一个草稿本…… woc……在51Nod上码LaTeX码了两个多小时…… 一开始码完了前半段,刚码完后半段突然被51Nod吃了,重新码完后半段之后前半段又被吃了,吓得 ...
- python 通过 pip 更新所有已安装的包
较新的 pip 已经支持 list --outdated 了,所以记录一下新的方法: pip list --outdated --format=legacy |awk '{print $1}' |xa ...
- 为什么 APM 能提升 IT 团队工作质量?
“有必要吗?”这是很多 IT 专业人员在尝试向团队内部推荐应用程序性能管理价值时所面临的问题.APM(应用程序性能管理)能为公司节约成本,提高内部工作效率,并真实了解用户对公司的系统和产品是否满意.除 ...
- 表单元素的required,autocomplete,list用法
required: 当在一个表单元素如:input中加上required属性时,点击提交表单按钮,针对input会弹出一个默认的警告信息,如下图: 代码如下: <form id="my ...