以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 算法理论与分析 』 (http://bbs.xml.org.cn/list.asp?boardid=60) ---- 请问如何求有向图的最长无环路? (http://bbs.xml.org.cn/dispbbs.asp?boardid=60&rootid=&id=35943) |
-- 作者:RoBa -- 发布时间:7/24/2006 4:30:00 AM -- 请问如何求有向图的最长无环路? att. 起点和终点未指定。这个是NPC么? |
-- 作者:phoenixinter -- 发布时间:7/24/2006 7:31:00 AM -- longest simple path是NPC 你在哪里看到这个题目? |
-- 作者:孤独 -- 发布时间:7/24/2006 10:38:00 AM -- 直接用Dijkstra不就ok了,只计算两点的最短路径,最短路径肯定无环啊。。 |
-- 作者:Logician -- 发布时间:7/24/2006 1:26:00 PM -- 题目是问最长,不是最短…… |
-- 作者:RoBa -- 发布时间:7/24/2006 1:33:00 PM -- To ph: OIBH上 有人说是bellman-ford,我怎么想也觉得不对 |
-- 作者:phoenixinter -- 发布时间:7/24/2006 5:57:00 PM -- 不是对不对的问题 本来就是NPC Bellman-Ford不用看就知道不对…… longest simple path的NPC性质可以参见CLRS Chapter 35 /36 似乎没有证明但是至少说到过 |
-- 作者:RoBa -- 发布时间:7/24/2006 7:11:00 PM -- o. CLRS上的这一部分以前没看过,觉得理论性太强了,拜一个 orz |
-- 作者:phoenixinter -- 发布时间:7/24/2006 7:58:00 PM -- 我只是一知半解……不用拜我……很钦佩你的上升速度 OTL.... |
-- 作者:Logician -- 发布时间:7/28/2006 9:48:00 PM -- 证明是简单的: 1、最长无环路问题的判定版本是“给定有向图D和整数k,问D中是否存在长度大于或等于k的无环路”(这一表述对有权图和无权图都有效)。 2、将Hamilton路问题规约到最长无环路问题(的判定版本)是显然的:输入一个n顶点的有向图D,直接问:有向图D中是否存在长度大于等于n-1的无环路? 简言之,对任意n顶点的有向图D,假如能够D中的找到最长无环路P,那么就能立即知道D中是否存在Hamilton路(只需看P的长度是否为n-1即可),从而最长无环路问题是NPC。 |
-- 作者:Supremgoooo -- 发布时间:7/30/2006 12:07:00 PM -- 要是无圈的可求。 一对一的用dijkstra,任意就用floyd.(最长就Floyd+Heap) floyd把动规判断部分的不等号反向就ok了 需要明确一点: [此贴子已经被作者于2006-7-30 19:32:22编辑过]
|
-- 作者:Supremgoooo -- 发布时间:7/30/2006 12:23:00 PM -- Floyd写的起点,终点未指定的算法: void Floyd_LongestPath(Graph G,Dist **&D) { int i,j,v; D=new Dist *[G.VerticesNum()]; for(i=0;i< G.VerticesNum();i++) D[i]=new Dist[G.VerticesNum()]; for(i=0;i< G.VerticesNum();i++){ for(j=0;j< G.VerticesNum();j++){ if(i==j)D[i][j].length=0; elseD[i][j].length=MinusINFINITY; } } for(v=0;v< G.VerticesNum();v++) { for(Edge e=G.FirstEdge(v);G.isEdge(e)e=G.NextEdge(e)) D[v][G.ToVertex(e)].length=1; } for(v=0;v< G.VerticesNum();v++) for(i=0;i< G.VerticesNum();i++) for(j=0;j< G.VerticesNum();j++) { if((D[i][j].length== MinusINFINITY||D[i][j].length<D[i][v].length+D[v][j].length) { D[i][j].length=D[i][v].length+D[v][j].length } } }
|
-- 作者:Logician -- 发布时间:7/30/2006 2:56:00 PM -- 你直接把最短路的算法改造成求最长路的? 请论证一下:为什么它求出来的就是最长路? |
-- 作者:Supremgoooo -- 发布时间:7/30/2006 6:14:00 PM -- 注:上面给的算法没考虑圈。 如果是不考虑圈,因为Floyd算法遍历了所有的路,如要求v1,v2间的最长路。Floyd算法探索了所有从v1到v2的路,进而从中间选出来一条最长的。 如果这条最长的路含有圈。。需要删除这条路,从新作Floyd搜索。。这个删除过程我认为也是有回溯的。。很复杂。。。 Dijkstra算法需要改进为遍历每一条边,即总循环次数由VerticesNum改为EdgesNum,即先前点的标注改为边的标注,并且每一条边的两个端点都是需要检测的,此时可求。 如果考虑圈。。。太复杂了。。。。 能不能对图预处理?把有圈图变成无圈图?例如把圈中一个顶点分成2个?
[此贴子已经被作者于2006-7-30 19:27:57编辑过]
|
-- 作者:Logician -- 发布时间:7/30/2006 7:26:00 PM -- 虽然任何一本算法/计算理论书上都有讲过“最长路是NPC”(从而间接证明了你的算法是错误的),不过我在这里还是给你一个直接的反例: “对于两点v1,v2,若求得的最长路上有v3,则v1,v3是v1到v3的最长路;v3,v2是v3到v2的最长路。”这个命题是错误的。 关于“最长路问题是NPC问题”的论述,参见Garey和Johnson的Computer And Intractability - A Guide To The Theory Of NP-Completeness(http://www.ieee.org.cn/dispbbs.asp?boardID=60&ID=36231 有电子版下载)第213页(电子书中的第112个页面):[ND29] Longest Path。 |
-- 作者:Supremgoooo -- 发布时间:7/30/2006 7:44:00 PM -- 你说的有理,我也想到了,这句话应该这样说:对于两点v1,v2,若求得的最长路上有v3,则(1)v1,v3是v1到v3的最长路;(2)v3,v2是v3到v2的最长路 这两个中间至少有一个成立。 只听过NP,不知道啥叫NPC,这个题: 请问书上说的这个题的方法是什么? |
-- 作者:Logician -- 发布时间:7/30/2006 8:28:00 PM -- 很对,如果是无圈图,有简单的解法。如果不是无圈图,那么就很难,所以一般情况下(即不保证无圈时)不可能用Floyd来做。 那本书上证明了这个问题是NPC问题。 NPC,即NP Complete。简单地来说,NPC问题是这样一类问题: 典型的NPC问题有:TSP(旅行商问题)、SAT(命题逻辑公式的可满足性问题)、哈密顿图问题(即,判定一个给定的图中是否有Hamilton回路)、哈密顿路问题(即,判定一个给定的图中是否有Hamilton通路)等。 如果想知道更多有关NPC的内容,就看我前面提到的那本书吧。那是关于NPC问题的经典著作。 |
-- 作者:Supremgoooo -- 发布时间:7/30/2006 8:39:00 PM -- |
-- 作者:baochens -- 发布时间:4/17/2008 10:18:00 PM -- NPC problem... |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
128.906ms |