无向未加权图中的最长路径

时间:2015-04-08 18:17:56

标签: algorithm math graph

我遇到了一个问题,我必须找出给定图表中最长的路径。我有边缘列表(例如{AB,BC}),它表明顶点/节点(A,B,C)之间存在边缘。现在我想弄清楚可能的最长路径(不重复顶点),以便它覆盖从任何顶点/节点开始的最大节点。

解决这个问题的最佳方法是什么? 我必须将其作为一个程序来实现。

我查了谷歌 最小生成树,Dijkstra的Alogorithms等等。但是无法找出最适合这个问题的方法。

非常感谢任何帮助或阅读参考。

4 个答案:

答案 0 :(得分:1)

这是NP-Hard。

如果可以解决这个问题,你可以解决哈密顿路径问题。

(最长路径= | V |< =>汉密尔顿路径)。

所以,只需选择旅行商问题的任何算法。给所有边缘加重一个。

我听说动态编程版本特别好。

答案 1 :(得分:1)

与寻找汉密尔顿路径类似,这需要通过回溯来解决。

对于图中的每个顶点,初始化path列表。 path的每个元素都将包含一个顶点,以及一个可以从该顶点到达的顶点列表(adj)。也就是path[i] -> (v, adj)。我们将规定adj[v]中的顶点不能是path中较早出现的顶点。

path[i+1]path[i]构建,允许path[i+1].v = pop(path[i].adj),并设置path[i+1].adj等于path[i+1].v中尚未在路径中的相邻顶点。如果没有弹出path[i].adj的元素,我们就达到了死胡同。如果路径长于目前发现的最大路径,则记录它。

现在弹出path中的所有元素,直到找到一个没有空adj列表的元素(这称为回溯)。在回溯之后,最后一个path元素具有非空adj列表,或者路径为空,即您已经回溯到开头。如果路径不为空,请像以前一样扩展路径。如果路径为空,请选择一个新的起始顶点并重新开始。

最终枚举所有可能的路径,因此找到的最长路径是您的答案。

您可能能够找到缩短此过程的方法,可能使用切边(也就是桥边)。

答案 2 :(得分:1)

由于您的问题并未说明图表是否为循环图表,您有两种选择:

选项1 图表是DAG

你很幸运,你可以在图表上使用拓扑排序并获得最长的路径!

选项2 图表不是DAG:

使用评论中提到的哈密顿算法

答案 3 :(得分:0)

赋予所有边缘权重1.不存在,给予权重n + 1。现在申请TSP。

留下一些东西供OP使用,但显然这比我想象的要难。