旅行商问题(TSP)、最长路径问题与哈密尔顿回路之间的联系(归约)

一,旅行商问题与H回路的联系(H回路 定义为 哈密尔顿回路)

旅行商问题是希望售货员恰好访问每个城市一次,最终回到起始城市所用的费用最低,也即判断图中是否存在一个费用至多为K的回路。(K相当于图中顶点的个数)

由于售货员可以从某个城市到其他任何一个城市。因此,该问题对应的是一个完全图(设为G)。而关于判断哈密尔顿回路的图(设为G)并不一定为完全图,因此,在将哈密尔顿回路问题归约到旅行商问题时,定义一个费用函数(详情参考《算法导论第二版中文版》第626页。

通过这个费用函数,将判断G是否存在一个费用至多为K的路径转化为G中是否有哈密尔顿回路。

二,最长路径问题与H回路的联系

图的最长路径:若一条路径包含了图中所有的顶点且各个顶点只包含一次,那么它就是一条最长路径。(如果有回路或圈则某个顶点一定会出现在路径中出现了两次)

哈密尔顿回路问题对应的图为G,最长路径问题对应的图为G′,那么将哈密尔顿回路问题归约到最长路径问题,实质上是已经G具有H回路(H圈),如何判断G′具有H路?

如何根据实际要证明的已知的最长路径问题建模而成的G′,构造出G呢?-----在G′的基础上增加一个顶点V,并将G′中各个点与V连一条边,形成的图即G。

若G中存在H圈则G′中存在H路。

理论证明参考《图论》中的度序列定理。

时间: 2024-08-27 04:59:37

旅行商问题(TSP)、最长路径问题与哈密尔顿回路之间的联系(归约)的相关文章

014-字串的连接最长路径查找

/* 014-字串的连接最长路径查找 题目描述 给定n个字符串,请对n个字符串按照字典序排列.  输入描述: 输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母. 输出描述: 数据输出n行,输出结果为按照字典序排列的字符串. 输入例子: 9 cap to cat card two too up boat boot 输出例子: boat boot cap card cat to too two up */ //c语言版  #inclu

二叉树中节点的最大距离(树的最长路径)——递归解法

上一篇文章说的是该题的一种变形,并给出了非递归解法. 现在我给出原题的一种递归解法.将会看到,现比较上篇博文,今天给出的递归解法的代码实现是相当简洁的. 问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \    

树中的最长路径

问题分析: 树中的路径,即是从树上的某个节点起,经过某个转折节点,到达另一个节点这样一条路径.而最长路径就是要找出这些路径中最长的那一条. 算法思路: 对于每个节点,记录下以该节点为根节点的子树中从该节点开始到所有叶子节点的路径中最长的那一条路径长度d1以及次长的那一条路径长度d2(最长和次长两条路径无公共边).那么对于我们想要解决的问题(树中的最长路径),就只需要枚举每个节点作为转折节点,求出所有d1+d2中的最大值. 关于d1,d2的求解: 对于任意一个节点,其d1值等于其所有子节点最大d1

变形二叉树中节点的最大距离(树的最长路径)——非递归解法

问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \         /   \ n6    n7    n8    n9 /                       / n10                

数据结构:可以用求最短路径的方法思想求最长路径么?给出详细解答。。

数据结构:可以用求最短路径的方法思想求最长路径么?为什么呢? 这里求解最短路径的通用方法有Dijkstra算法和Floyd-Warshall算法,Dijkstra算法不允许边的权值为负,也不允许有回路,而Floyd-Warshall算法可以允许边的权值为负,但不允许负值边构成回路,即可以求解有回路的图 它们都有局限,这两种算法的思想可以用来求最长路径么?? 为什么 不可以? (感谢给我答案的好心人:来自于知乎:http://www.zhihu.com/question/27201255和CSDN

Codefroces Gym 100781A(树上最长路径)

http://codeforces.com/gym/100781/attachments 题意:有N个点,M条边,问对两两之间的树添加一条边之后,让整棵大树最远的点对之间的距离最近,问这个最近距离是多少. 思路:一开始看成只有两个连通块,后来才注意到是多个连通块.DFS搜树上最长路径.答案有三种:第一种是添加了边之后,树的最长路径还是原来子树的路径,第二种是对子树长度进行排序后,两个最长的距离分别除以2向上取整后加上1.第三种比较难注意到,就是第二第三长的分别除以2向上取整后加上2,因为可能隔着

hdu2196 Computer(树上最长路径 dp)

题目链接:点击打开链接 题意描述:给定一棵树,树上每条边的有一个权值,问从任意一个点出发能走得最长路径是多少? 解题思路:树上最长路径 dp 1.任意找一个点作为根节点,将无根树转化为有根树 2.在dfs过程中更新f[i],g[i],其中f[i]记录以i为节点向下扩展最长路,g[i]为次长路,并用mark标记每个节点最长路的儿子节点 3.在dfs1的过程中更新h[i],h[i]表示以i为节点的向上扩展的最长路 代码: #pragma comment(linker,"/STACK:10240000

在二进制树中的节点之间的最大距离(最长路径树)——递归解决方案

上一篇文章即是对这一主题的变化.并给出了一个非递归溶液. 我给出原题的一种递归解法. 将会看到,现比較上篇博文.今天给出的递归解法的代码实现是相当简洁的. 问题描写叙述: 假设我们把二叉树看成一个图.父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序.求一棵二叉树中相距最远的两个节点之间的距离.測试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \  

hihocoder(1050) 树中最长路径

树的最长路径,即求一颗树的直径问题,dfs和bfs都可一解决,但一直觉得dfs的比较绕,不好理解. 于是写了bfs的方法,其中0节点当作哨兵,每次从队列中取出0节点的时候,就知道一轮bfs结束,可以把深度加一. bfs的思路很简单: 1.随便找一个节点,以该节点为起点进行一次bfs,得出的最后一个顶点,一定是直径的一端. 2.再以这个直径的一端为起点进行一次bfs,得出的直径的另一端,然后这两个端点之间即为直径(最长路径). 刚开始老是WA,后来发现是因为忘记把顶点标记清零了. 1 #inclu