当前位置: 首页 > 知识库问答 >
问题:

无向无权图中的最长路径

范峰
2023-03-14

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

解决这个问题的最佳方法是什么?我必须把它作为一个计划来实施。

我在谷歌上查找最小生成树、Dijkstra的算法等等。但我想不出什么最适合解决这个问题。

任何帮助或阅读参考资料将不胜感激。

共有3个答案

公羊新
2023-03-14

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

对于图形中的每个顶点,初始化路径列表。path的每个元素将包含一个顶点,以及可以从该顶点到达的顶点列表(adj)。即,path[i]-

path[i1]是通过让path[i1].v=pop(path[i].adj)并设置path[i1].adj等于路径[i1].v中尚未在路径中的path[i1].v的相邻顶点而构建的。如果路径[i].adj中没有要弹出的元素,那么我们就到了死胡同。如果路径比目前发现的最大路径长,则记录该路径。

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

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

您可以找到缩短此过程的方法,可能使用切割边(又名桥边)。

拓拔麒
2023-03-14

这是NP难的。

你们可以解决哈密顿路径问题,若你们能解决这个问题的话。

(最长路径=| V|

所以,只要拿起旅行推销员问题的任何算法。给所有的边一个重量。

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

贲培
2023-03-14

由于您的问题没有说明图表是否循环,因此您有两个选项:

选项1:图形为DAG

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

选项2:图形不是DAG:

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

 类似资料:
  • 我需要找到图中最长的路径基于边权值。对于图像上的图,它应该是4,5,3,2,1(顺序无关紧要),最好的算法是什么?如果您知道,在您的图中,每个节点都有一个对图中任何其他节点的引用(边)。算法应该改变吗?

  • 我知道Bellman Ford算法使用负权值,但我希望我可以修改我现有的最短路径方法。

  • 我试图将这个问题概念化,然后为它编写Java代码。我知道这里有一些讨论,但我没有看到很多回答者,所以我想通过写下我的想法来重申这个问题,我希望从你们那里得到一些反馈。谢谢 我的想法:对于每个叶节点,找到从根节点到它的最长路径。对于所有路径,找到最大路径长度 然而,这不就是蛮力吗,对此还有更优雅的解决方案吗? 我听说过使用Djikstra的负权重算法,但在某些地方它说这只适用于特定情况?我也看到了关

  • 我能够使用这个算法在一个加权DAG中找到最长的路径(使用拓扑排序,然后放松每个边)。我现在的问题是,是否有一个算法来找到DAG的前3个最长的路径?或者,有没有实现这种算法的javascript或java库?

  • 我想在有向(无环)图中找到最长的路径。假设我知道起始节点-汇。路径应该从这一点开始。我在想我可以将边的权重设置为-1。有很多方法可以找到所有最短的路径,但你必须通过终点。有没有可能得到最短的路径(无论最终节点如何)? 假设我想为节点 nr 1(汇)找到最长路径。所以这个算法给了我1-2-3-4-5-6。

  • 我需要为一组有向无环图找到从节点 0 开始的最长路径。我正在使用维基百科中的最长路径问题算法。我已经让算法适用于大多数图形,但对于其他图形,它没有给出正确的结果。算法为: 图形实现使用邻接列表来存储图形。如果我传递一个图,例如: 我得到的答案5,这是正确的。但是,如果我通过图表: 然后我得到2,而正确答案应该是3。 我使用的TopSort2算法是: DFS 算法包括: