繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM