关于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问题的研究的更多相关文章

  1. unity中camera摄像头控制详解

    目录 1. 缘起 2. 开发 2.1. 建立项目 2.2. 旋转 2.2.1. 四元数 2.3. 移动 2.3.1. 向量操作 2.4. 镜头拉伸 2.5. 复位 2.6. 优化 1 缘起 我们的产品 ...

  2. 闲来无聊,研究一下Web服务器 的源程序

    web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...

  3. SQLSERVER聚集索引与非聚集索引的再次研究(上)

    SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...

  4. 深入研究Visual studio 2017 RC新特性

    在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...

  5. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  6. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  7. SQLSERVER聚集索引与非聚集索引的再次研究(下)

    SQLSERVER聚集索引与非聚集索引的再次研究(下) 上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 ...

  8. 开源Word读写组件DocX 的深入研究和问题总结

    一. 前言 前两天看到了asxinyu大神的[原创]开源Word读写组件DocX介绍与入门,正好我也有类似的自动生成word文档得需求,于是便仔细的研究了这个DocX. 我也把它融入到我的项目当中并进 ...

  9. 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)

    前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...

随机推荐

  1. JavaWeb学习 (二十四)————Filter(过滤器)常见应用

    一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import ja ...

  2. #5 Python变量与输入输出

    前言 学习一门编程语言,最基本的无非不过学习其变量规则.条件语句.循环语句和函数,接下来的几节将开始记录这些基本的语法,本节主要记录变量规则! 一.Python输入输出 在说Python变量之前,先补 ...

  3. Vim——回顾整理

    一.命令练习(一) hjkl(左下上右) 保存到某路径 :saveas 路径 w 到下一个单词的开头 e 到下一个单词的结尾 % 括号匹配移动(),{},[] 0 到行头 $ 到行头 gU字母变大写 ...

  4. 【github&&git】4、git常用命令(持续更新中)

    git常用命令(持续更新中) 本地仓库操作git int                                 初始化本地仓库git add .                       ...

  5. 将javaWeb项目转maven项目

    不经常做此类转换,所以总是忘记转换方法,特此,记录下转换步骤 1.首先从SVN检出项目 2.找到导出项目路径 3.按住Shift+鼠标右键,打开控制台 3.输入命令mvn eclipse:eclips ...

  6. 大数据之 Spark

    1 渊源 于2009由Matei Zaharia创立了spark大数据处理和计算框架,基于内存,用scala编写. 2 部署 2.1 需要软件包 下载路径见已有博文 Jdk ——因为运行环境为jvm ...

  7. 解决Linux服务器tomact-8.0启动慢的问题

    环境信息: CentOS release 6.8 tomcat-8.0 JDK1.8 一.启动tomcat #sh /root/tomcat-8.0/bin/startup.sh #tailf /ro ...

  8. HDU6216

    A Cubic number and A Cubic Number Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/3276 ...

  9. plsql调试存储过程卡住的原因以及处理

    用PLSQL调试存储过程的时候,经常会遇到这个的情况,点调试后,继续点单步都是灰色,想停下来,但是取消也要点很多次才能取消掉. 就像下面的情况: 一直以为是个BUG,直到最近有人告诉我了真相. 出现这 ...

  10. 聊聊setTimeout和setInterval线程

    在聊setTimeout和setInterval这两个事件的前,先聊另外一个与之密切关联的知识点,那就是线程(thread).而线程有常常跟另外一个词语--“进程”一起出现.那么何为线程?何为线程呢? ...