我遇到了一个问题,我必须找出给定图表中最长的路径。我有边缘列表(例如{AB,BC}),它表明顶点/节点(A,B,C)之间存在边缘。现在我想弄清楚可能的最长路径(不重复顶点),以便它覆盖从任何顶点/节点开始的最大节点。
解决这个问题的最佳方法是什么? 我必须将其作为一个程序来实现。
我查了谷歌 最小生成树,Dijkstra的Alogorithms等等。但是无法找出最适合这个问题的方法。
非常感谢任何帮助或阅读参考。
答案 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使用,但显然这比我想象的要难。