2010-03-26 90 views

回答

21

Dynamic programming。考虑到它是DAG,它也在Longest path problem中引用。

下面的代码从维基百科:

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)) 
+1

这只返回路径的长度。代码是否可以轻松修改以返回路径? – oschrenk 2012-04-02 20:46:12

+1

是的,与大多数DP问题一样 - 跟踪以前的情况并重新开始。 – Larry 2012-07-17 16:34:43

+2

'topOrder(G)'是[topological order](https://en.wikipedia.org/wiki/Topological_sorting) – 2016-10-29 14:22:32

4

只要该图是无环,所有你需要做的是否定的边缘权重和运行任何最短路径算法。

编辑:很明显,你需要一个支持负权重的最短路径算法。另外,来自维基百科的算法似乎有更好的时间复杂性,但我会在这里留下我的答案供参考。

+0

,我们是否保持负面权重为负? :p – Hellnar 2010-03-27 00:26:33

+0

@Hellnar:不,如果你在原始图中有负值,他们应该变为正值。 w'= - (w) – 2010-03-27 09:55:06

1

可以通过关键路径方法来解决:
1.找到一个拓扑排序
2.找到关键路径
参见[Horowitz 1995],Fundamentals of Data Structures in C++,Computer Science Press,New York。

贪婪策略(例如Dijkstra)不会工作,不管:1。使用“max”而不是“min”2.将正面权重转换为负面3.给出非常大的数字M并使用M-w作为权重。

相关问题