Welcher Algorithmus kann verwendet werden, um den längsten Pfad in einem ungewichteten gerichteten azyklischen Graphen zu finden?Längster azyklischer Pfad in einem gerichteten ungewichteten Graph
Antwort
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))
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.
und behalten wir die negativen Gewichte als negativ? : p – Hellnar
@Hellnar: Nein, wenn Sie negative Gewichte in der ursprünglichen Grafik haben, sollten sie positiv werden. w '= - (w) –
Wikipedia hat einen Algorithmus: http://en.wikipedia.org/wiki/Longest_path_problem
Sieht aus wie sie Gewichtungen verwenden, sollten aber mit Gewichtungen alle auf 1 gesetzt
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.
- 1. Längster Pfad zwischen zwei Knoten
- 2. Längster Pfad in Java-Code
- 3. Längster einfacher Pfad
- 4. Finden eines Zyklus in einem ungerichteten Graph vs Finden eines in einem gerichteten Graph
- 5. Randomized Algorithmus für die Hamilton-Pfad in einem gerichteten Graphen
- 6. Speichern eines großen gerichteten ungewichteten Graphen mit Milliarden von Knoten und Scheitelpunkten
- 7. Kantenklassifikation während der Breite-zuerst-Suche auf einem gerichteten Graph
- 8. Erstellen von Gruppen aus einem gerichteten Graph-Wörterbuch
- 9. Längster Pfad in kleiner Grafik mit kleinem Grad
- 10. Alle möglichen Pfade von einem Knoten zum anderen in einem gerichteten Baum (igraph)
- 11. Algorithmus die Anzahl unterschiedlicher Pfade in einem gerichteten Graphen
- 12. Wie kann ich jeden Pfad in einem gerichteten Diagramm auflisten? (C#)
- 13. Finden Sie negative Zyklen in einem gerichteten kantengewichteten Graph mit JGraph
- 14. Längster Gegenstand in jeder Gruppe
- 15. Effiziente Suche in einem gerichteten Graphen
- 16. Generieren Sie einen gerichteten Zufallsgraphen mit Erdős-Rényi Modell aus einem realen gerichteten Graphen
- 17. Wie finde ich den kürzesten Pfad, der alle Knoten in einem gerichteten zyklischen Graphen abdeckt?
- 18. Einen Pfad mit der größten Anzahl von Knoten in einem gerichteten Graphen finden
- 19. Finde den kürzesten Pfad in einem gerichteten Graphen, der durch bestimmte Ecken verläuft
- 20. Prüfen, ob in gerichteter azyklischer Grafik ein Pfad zwischen zwei Vertices existiert - Abfragen
- 21. Wie transformiere ich einen ungerichteten, sehr zyklischen Graph in einen gerichteten azyklischen Graphen?
- 22. Graph Serialisierung
- 23. Directed Graph Adjacency Matrix Den Pfad finden
- 24. Längster Pfadname in Mac OS X HFS +
- 25. Directed to ungerichteten Graph
- 26. Zyklusaufzählung eines gerichteten Graphen mit mehreren Kanten
- 27. Kann man alle eingehenden Kanten zu einem Knoten in einem gerichteten Graphen finden?
- 28. Lesen eines gerichteten Graphen in R
- 29. Graph Navigation mit C#
- 30. Encoding gerichteten Graphen als Zahlen
Dies gibt nur die Länge des Pfads zurück. Kann der Code leicht geändert werden, um den Pfad zurückzugeben? – oschrenk
Ja, genauso wie bei den meisten DP-Problemen - verfolge die vorherigen und gehe zurück. – Larry
'topOrder (G)' ist die Liste der Knoten von G in [topologische Reihenfolge] (https://en.wikipedia.org/wiki/Topological_sorting) –