在未加权图中找到最长路径

问题描述 投票:0回答:2

我在这个问题上遇到了很大的困难。

如果我有一个图,有向或无向,未加权且没有循环。如何找到最长的路径? 我见过的许多算法都依赖于对图进行加权,并反转权重并使用贝尔曼福特。 我也见过动态规划解决方案,但这里的人们只是在寻找任何路径,我正在寻找来自 s-t 的路径。

我一直在尝试将图分解为子问题,其中我一次添加一个节点,并给它一个来自父节点的值加一,但我只是无法获得正确的逻辑

谁能提供一种算法,指数时间就可以,伪多项式就很棒了?

algorithm path-finding
2个回答
0
投票

如果图可以是有向的 无向的,那么我们可以将问题简化为仅针对有向图。如果它是无向的,那么您应该从 v -> w 和 w -> v 建立边。您可以使用修改后的 DFS 来测量从传递给此函数的节点开始的最长路径。 然后对每个节点运行这个函数并获取最大值。

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)。


0
投票

您可以使用改进的 DFS 通过执行两次 DFS 来找到它 O(n)。首先,您从随机节点执行 dfs,找到距该节点最远的节点,然后再次从找到的节点执行 dfs。我解决了一个 leetcode 问题,需要这个,所以如果你想查看代码,这里是链接。 https://leetcode.com/problems/minimum-height-trees/solutions/5061978/c-twice-dfs-solution/

© www.soinside.com 2019 - 2024. All rights reserved.