Kürzester Weg in DAG finden?
Aufgabe:
Ich muss auf diesem DAG den unteren Algorithmus ausführen, weiß jedoch nicht, wie ich weiter vorgehen soll.
In einem Youtube Video kam mir der Algorithmus sehr simpel vor, aber die Formulierung unten lässt mich zweifeln, dass es das gleiche Verfahren ist wie im Video.
Ich habe den ersten Schritt, also die topologische Sortierung gemacht und bin auf "v1, v0, v6, v2, v7, v4, v3, v5" gekommen. Jetzt soll ich "s = 0" setzen und die restlichen Knoten auf ∞. soweit ich verstanden habe. Im Video (https://www.youtube.com/watch?v=TXkDpqjDMHA) müsste ich jetzt einfach den Graph durchgehen und jedes mal, wenn möglich, den kürzesten Pfad aktualisieren, bis ich für jeden Knoten den kürzesten Pfad vom Startknoten aus gefunden habe.Was da unten jedoch im Algorithmus steht, weiß ich nicht.
1 Antwort
Im Grunde machst du zwei Durchläufe durch dne Graphen von Anfang bis Ende. (Da der Graph azyklisch ist und gerichtet gibt es auch Anfänge und Enden, evtl. zwar mehrere, aber das macht es kaum schwerer.)
Beim ersten Durchlauf sortierst du die Knoten topologisch. Das heißt, dass für jeden Knoten alle seine Nachfolger in der Sortierung danach kommen.
Das schaust du dir am besten einmal an ein paar Beispielen an, dann wird offensichtlich, was das bedeutet.
Der Graph ist dann so sortiert, dass erst alle Vorgänger eines Knoten drankommen, bevor der Knoten selbst an der Reihe ist.
Beim zweiten Durchlauf gehst du dann alle Knoten der Reihe nach durch. Durch die Sortierung arbeitest du erst alle Vorgänger eines Knotens ab, bevor du den Knoten selbst behandelst.
Dadurch kannst du für einen Knoten die jeweiligen Kosten berechnen, indem du die bereits berechneten Kosten aller Vorgänger plus die Kantengewichte vergleichst.
Die topologische Sortierung funktioniert folgendermaßen:
Für jeden Knoten bestimmst du die Menge der noch nicht abgearbeiteten Vorgängerknoten. Ist diese 0, fügst du den Knoten als nächstes Element in der Sortierung hinzu und verringerst die Zahl der noch nicht abgearbeiteten Vorgängerknoten für alle Nachfolger um 1.