【发布时间】:2010-03-26 17:26:58
【问题描述】:
什么算法可以用来在未加权的有向无环图中找到最长的路径?
【问题讨论】:
什么算法可以用来在未加权的有向无环图中找到最长的路径?
【问题讨论】:
Dynamic programming。在Longest path problem 中也引用了它,因为它是一个 DAG。
以下代码来自维基百科:
algorithm dag-longest-path is
input:
Directed acyclic graph G
output:
Length of the longest path
length_to = array with |V(G)| elements of type int with default value 0
for each vertex v in topOrder(G) do
for each edge (v, w) in E(G) do
if length_to[w] <= length_to[v] + weight(G,(v,w)) then
length_to[w] = length_to[v] + weight(G, (v,w))
return max(length_to[v] for v in V(G))
【讨论】:
topOrder(G)是topological order中G的顶点列表
只要图是非循环的,您需要做的就是否定边权重并运行任何最短路径算法。
编辑:显然,您需要一个支持负权重的最短路径算法。此外,来自维基百科的算法似乎具有更好的时间复杂度,但我将把答案留在这里以供参考。
【讨论】:
维基百科有一个算法:http://en.wikipedia.org/wiki/Longest_path_problem
看起来他们使用权重,但应该使用所有设置为 1 的权重。
【讨论】:
可以通过关键路径法解决:
1. 求拓扑排序
2.找到关键路径
参见 [Horowitz 1995],C++ 数据结构基础,计算机科学出版社,纽约。
无论如何,贪婪策略(例如 Dijkstra)都行不通:1。使用“max”而不是“min” 2. 将正权重转换为负权 3. 给出一个非常大的数字 M 并使用 M-w 作为权重。
【讨论】: