[英]Longest Path in an undirected unweighted graph
我遇到了一个问题,我必须找出给定图中的最长路径。 我有一条边列表(例如{AB,BC}),它指出在顶点/节点(A,B,C)之间有一条边。 现在,我想找出可能的最长路径(不重复顶点),使其涵盖从任何顶点/节点开始的最大节点。
解决此问题的最佳方法是什么? 我必须将此作为程序来实现。
我在Google上查找了最小生成树,Dijkstra的Alogorithms等。 但无法找出最适合此问题的方法。
任何帮助或阅读参考文献将不胜感激。
这是NP-Hard。
如果可以解决此问题,则可以解决哈密顿路径问题。
(最长路径= | V | <=>哈密顿路径)。
因此,只需选择旅行商问题的任何算法即可。 给所有边缘重一。
我听说动态编程版本特别好。
与查找汉密尔顿路径相似,这需要通过回溯来解决。
对于图中的每个顶点,初始化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
列表,或者路径为空,即您已回溯到起点。 如果路径不为空,请像以前一样扩展路径。 如果路径为空,请选择一个新的起始顶点,然后重新开始。
最终将列举所有可能的路径,因此找到的最长路径就是您的答案。
您可能能够找到缩短此过程的方法,可能使用切边(也称为桥边)。
由于您的问题不会说图形是循环的还是不是,因此您有两个选择:
选项1 : 图表为DAG
您很幸运,您可以在图形上使用拓扑排序并获得最长的路径!
选项2 : 图表不是DAG:
使用评论中提到的哈密顿算法!
赋予所有边权重1.不存在,赋予权重n + 1。 现在应用TSP。
给OP留点时间解决,但是很显然,这比我想象的要难。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.