Längste Pfad in DAG
Finden Sie den längsten Pfad in einem DAG, ich bin mir bewusst, dass der 2-algorithmen: algo 1: führen Sie eine topologische Sortierung + verwenden Sie dynamische Programmierung auf das Ergebnis der Sortierung ~ oder ~ algo 2: aufzählen aller Pfade in die DAG mit der DFS, und notieren Sie die längste. Es scheint, wie das auflisten aller Wege mit DFS hat eine bessere Komplexität als algo-1. Ist das wahr?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre zweite option ist falsch: die DFS nicht erforschen alle möglichen Wege, es sei denn, Ihr graph ein Baum oder ein Wald, und starten Sie von den Wurzeln. Der zweite Algorithmus, den ich kenne, ist die Negation der GEWICHTE und die Suche nach dem kürzesten Weg, aber es ist etwas langsamer als die top-Art + DP-Algorithmus, dass Sie gelistet als #1.
A->B->C
; Sie beginnen DFS von B ist, gehen Sie zu C, und stoppen; dann Neustart von A zu B gehen, und wieder stoppen, weil die Sie besucht haben, C schon. Beide Weg, der DFS gefunden,B-C
undA-B
sind von der Länge 1; das längste PfadA-B-C
ist der Länge 2.A->B,C ; B->D ; C->D ; D->E,F ; E->G ; F->G
.A
ist eine Quelle, so dass Sie beginnen die Erkundung von es. Sie gehenA-B-D-E,G
, gehen Sie zurück zuD
versuchenA-B-D-F-G
, gehen Sie zurück zuA
versuchenA-C-D
, und zu stoppen, weilD
vollständig erforscht jetzt. Wenn der längste Pfad durch das Gewicht istA-C-D-E-G
DFS ist nicht zu finden.Aufzählen aller Pfade in einer DAG mit "DFS":
visited
im code: Sie einzustellen, aber Sie tun es nicht verwenden, um zu entscheiden, ob Sie weiterhin sollten die traversal. Dies ist nicht das, was genannt DFS, da die DFS nicht besuchen Knoten, die vollständig erforscht. Der größte Unterschied zwischen DFS und Ihr code ist, dass dein code ist äußerst ineffizient. Wiederholen Sie die gleiche Diamant-Muster fünfzig mal zu sehen, was ich meine: dein Programm wird untersuchen, alle2^50
Wege, und das ist eine Menge von Pfaden zu erkunden.Kein DFS benötigt.
Algorithmus : nimmt eine DAG-G.
Jeder Bogen besitzt eine variable E
max_path ist die höchste E innerhalb der Kanten, wenn alle Knoten verarbeitet wurden.