2010-03-26 14 views

Antwort

21

Dynamic programming. Es wird auch in Longest path problem verwiesen, da es sich um ein DAG handelt.

Der folgende Code aus Wikipedia:

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

Dies gibt nur die Länge des Pfads zurück. Kann der Code leicht geändert werden, um den Pfad zurückzugeben? – oschrenk

+1

Ja, genauso wie bei den meisten DP-Problemen - verfolge die vorherigen und gehe zurück. – Larry

+2

'topOrder (G)' ist die Liste der Knoten von G in [topologische Reihenfolge] (https://en.wikipedia.org/wiki/Topological_sorting) –

4

Solange der Graph azyklisch ist, alles, was Sie tun müssen, ist die Kantengewichte negieren und jede Shortest-Path-Algorithmus auszuführen.

EDIT: Offensichtlich benötigen Sie einen Algorithmus für den kürzesten Pfad, der negative Gewichtungen unterstützt. Außerdem scheint der Algorithmus von Wikipedia eine bessere zeitliche Komplexität zu haben, aber ich lasse meine Antwort hier als Referenz.

+0

und behalten wir die negativen Gewichte als negativ? : p – Hellnar

+0

@Hellnar: Nein, wenn Sie negative Gewichte in der ursprünglichen Grafik haben, sollten sie positiv werden. w '= - (w) –

1

durch kritische Pfad-Methode gelöst werden kann arbeiten:
1. eine topologische Ordnung finden
2. finden Sie den kritischen Pfad
siehe [Horowitz 1995], Grundlagen der Datenstrukturen in C++, Computer Science Press, New York.

Gierige Strategie (z. B. Dijkstra) wird nicht funktionieren, egal: 1. verwende "max" anstelle von "min" 2. konvertiere positive Gewichte in negative 3. Gib eine sehr große Zahl M und verwende M-w als Gewicht.

Verwandte Themen