图中最长的路径
Longest path in a graph
给定一个顶点从 0 到 n-1 的无向图,编写一个函数来找到顶点构成递增序列的最长路径(按边数)。
你会推荐什么样的方法来解决这个难题?
有像 Dijkastras 算法这样的算法,可以对其进行修改以找到最长而不是最短的路径。
这是一个简单的方法:
- 使用递归算法查找 2 个节点之间的所有路径。
- Select最长的路径。
如果您需要有关递归算法的帮助,请直接询问。
我会做一个动态规划算法。将 L(u) 表示为从节点 u 开始的最长有效路径。您的基本情况是 L(n-1) = [n-1](即仅包含节点 n-1) 的路径。然后,对于从n-2到0的所有节点s,从s开始执行BFS你只允许遍历边缘 (u,v) 这样 v > 你。一旦你点击了一个你已经开始的节点(即一个节点 u 这样你已经计算了 L(u)), L(s) = 来自s[=58=的最长路径] 到 u + L(u) 在所有可能的 u > s.
你的问题的答案是节点 u 具有最大值 L(u),这个算法是 O(E),其中 E 是图中的边数。我不认为你可以渐近地做得比这更快
编辑:实际上,“BFS”甚至不是 BFS:它只是遍历边缘 (s,v)这样 v > s (因为你已经访问了所有节点 v > s,所以没有遍历:你会立即到达你已经开始的节点)
所以实际上,简化的算法是这样的:
longest_path_increasing_nodes():
L = Hash Map whose keys are nodes and values are paths (list of nodes)
L[n-1] = [n-1] # base case
longest_path = L[n-1]
for s from n-2 to 0: # recursive case
L[s] = [s]
for each edge (s,v):
if v > s and length([s] + L[v]) > length(L[s]):
L[s] = [s] + L[v]
if length(L[s]) > length(longest_path):
longest_path = L[s]
return longest_path
编辑 2022-03-01: 修复了最后一个 if 语句中的拼写错误;谢谢 user650654!
您可以通过将每个(无向)边替换为朝向具有更大编号的节点的有向边来将原始图转换为有向无环图。
然后你会得到这个:https://www.geeksforgeeks.org/find-longest-path-directed-acyclic-graph/
给定一个顶点从 0 到 n-1 的无向图,编写一个函数来找到顶点构成递增序列的最长路径(按边数)。
你会推荐什么样的方法来解决这个难题?
有像 Dijkastras 算法这样的算法,可以对其进行修改以找到最长而不是最短的路径。
这是一个简单的方法:
- 使用递归算法查找 2 个节点之间的所有路径。
- Select最长的路径。
如果您需要有关递归算法的帮助,请直接询问。
我会做一个动态规划算法。将 L(u) 表示为从节点 u 开始的最长有效路径。您的基本情况是 L(n-1) = [n-1](即仅包含节点 n-1) 的路径。然后,对于从n-2到0的所有节点s,从s开始执行BFS你只允许遍历边缘 (u,v) 这样 v > 你。一旦你点击了一个你已经开始的节点(即一个节点 u 这样你已经计算了 L(u)), L(s) = 来自s[=58=的最长路径] 到 u + L(u) 在所有可能的 u > s.
你的问题的答案是节点 u 具有最大值 L(u),这个算法是 O(E),其中 E 是图中的边数。我不认为你可以渐近地做得比这更快
编辑:实际上,“BFS”甚至不是 BFS:它只是遍历边缘 (s,v)这样 v > s (因为你已经访问了所有节点 v > s,所以没有遍历:你会立即到达你已经开始的节点)
所以实际上,简化的算法是这样的:
longest_path_increasing_nodes():
L = Hash Map whose keys are nodes and values are paths (list of nodes)
L[n-1] = [n-1] # base case
longest_path = L[n-1]
for s from n-2 to 0: # recursive case
L[s] = [s]
for each edge (s,v):
if v > s and length([s] + L[v]) > length(L[s]):
L[s] = [s] + L[v]
if length(L[s]) > length(longest_path):
longest_path = L[s]
return longest_path
编辑 2022-03-01: 修复了最后一个 if 语句中的拼写错误;谢谢 user650654!
您可以通过将每个(无向)边替换为朝向具有更大编号的节点的有向边来将原始图转换为有向无环图。
然后你会得到这个:https://www.geeksforgeeks.org/find-longest-path-directed-acyclic-graph/