Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在无权图中寻找最长路径_Algorithm_Path Finding - Fatal编程技术网

Algorithm 在无权图中寻找最长路径

Algorithm 在无权图中寻找最长路径,algorithm,path-finding,Algorithm,Path Finding,我在这个问题上真的很难处理 如果我有一个图,有向的或无向的,未加权的,没有循环。我怎样才能找到最长的路? 我见过的许多算法都依赖于对图进行加权,并反转权重并使用bellman ford。 我也见过动态规划解决方案,但这里的人们只是在寻找任何路径,我在从s-t中寻找一条 我一直在尝试将图分解为子问题,每次添加一个节点,并给它一个来自父节点的值加上一,但我无法正确理解逻辑 谁能提供一个算法,指数时间就可以了,伪多项式就太棒了?如果图可以是有向的或无向的,让我们把问题简化为有向图。如果它是无向的,那么

我在这个问题上真的很难处理

如果我有一个图,有向的或无向的,未加权的,没有循环。我怎样才能找到最长的路? 我见过的许多算法都依赖于对图进行加权,并反转权重并使用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)解吗?