Algorithm 在无权图中寻找最长路径
我在这个问题上真的很难处理 如果我有一个图,有向的或无向的,未加权的,没有循环。我怎样才能找到最长的路? 我见过的许多算法都依赖于对图进行加权,并反转权重并使用bellman ford。 我也见过动态规划解决方案,但这里的人们只是在寻找任何路径,我在从s-t中寻找一条 我一直在尝试将图分解为子问题,每次添加一个节点,并给它一个来自父节点的值加上一,但我无法正确理解逻辑Algorithm 在无权图中寻找最长路径,algorithm,path-finding,Algorithm,Path Finding,我在这个问题上真的很难处理 如果我有一个图,有向的或无向的,未加权的,没有循环。我怎样才能找到最长的路? 我见过的许多算法都依赖于对图进行加权,并反转权重并使用bellman ford。 我也见过动态规划解决方案,但这里的人们只是在寻找任何路径,我在从s-t中寻找一条 我一直在尝试将图分解为子问题,每次添加一个节点,并给它一个来自父节点的值加上一,但我无法正确理解逻辑 谁能提供一个算法,指数时间就可以了,伪多项式就太棒了?如果图可以是有向的或无向的,让我们把问题简化为有向图。如果它是无向的,那么
谁能提供一个算法,指数时间就可以了,伪多项式就太棒了?如果图可以是有向的或无向的,让我们把问题简化为有向图。如果它是无向的,那么你应该从v->w和w->v生成边。可以使用“修改”来测量从传递到此函数的节点开始的最长路径。 然后对每个节点运行此函数并获得最大值 DFS的伪代码:
DFS(Node v):
if (v.visited?) return 0;
v.visited = true;
longestPath = 0;
foreach(Node n : v.neighbours):
longestPath = max(longestPath, DFS(n) + 1)
return longestPath
问题的伪代码:
longestPath(Node[] verticies):
longestPath = 0
foreach(Node v : vertices):
foreach(Node w: vertices):
w.visited = false;
longestPath = max(longestPath, DFS(v))
return longestPath;
它在O(n^2)中工作,但我认为这个解决方案是直接的。
只是想让您知道,有一个解决方案是O(n)。欢迎使用SO!到目前为止你试过什么?我们在这里更多地是为了帮助解决“我尝试了X,但它没有达到我预期的效果,反而导致了一个错误!”这种形式的特定问题。加权情况是未加权情况的一个纯粹推广:要将未加权情况简化为加权情况,只需使用一个加权图,所有权重都相等(例如,重量为1。)在无向非循环图中,从
s
到t
的最长路径必然是从s
到t
的唯一路径。否则,只需将所有权重设置为1,就可以将未加权图转换为加权图。此外,图的无向非循环意味着什么有一条边的无向(u,v)
它包含一个平凡的循环u->v->u
@user3386109:我是认真的,因为我从来没有处理过它们。我描述的平凡循环似乎是无向无环图中唯一允许的循环(我认为这是一个用词不当)这就是我的困惑所在。非常感谢!你能告诉我O(n)解吗?