Suche nach dem längsten Pfad in einem Graphen mit STL und topologischer Sortierung

C++ Hard STL

Aufgabe «Suche nach dem längsten Pfad in einem Graphen mit STL und topologischer Sortierung»

Gegeben ist ein gerichteter azyklischer Graph (DAG) mit N Knoten und M Kanten. Jede Kante hat ein ganzzahliges Gewicht (kann negativ sein). Es ist erforderlich, die Länge des längsten Pfades von einem gegebenen Startknoten S zu allen anderen Knoten zu finden. Wenn ein Knoten nicht erreichbar ist, geben Sie „INF“ aus. Verwenden Sie die topologische Sortierung (Kahn-Algorithmus) und dynamische Programmierung. Einschränkungen: N ≤ 10^5, M ≤ 2*10^5, Gewichte modulo ≤ 10^9. Es wird garantiert, dass der Graph keine Zyklen enthält.

Eingabeformat

Erste Zeile: N M S (1 ≤ N ≤ 100000, 0 ≤ M ≤ 200000, 1 ≤ S ≤ N). Die folgenden M Zeilen: u v w (1 ≤ u, v ≤ N, -10^9 ≤ w ≤ 10^9).

Ausgabeformat

Geben Sie N Zeilen aus: Für jeden Knoten i (von 1 bis N) geben Sie die Länge des längsten Pfades von S zu i aus, oder „INF“, wenn der Knoten nicht erreichbar ist. Die Pfadlänge von S zu S wird als 0 angenommen.

Beispiele

Beispiel 1

EINGABE
4 3 1 1 2 5 1 3 3 2 4 2
AUSGABE
0 5 3 7

Beispiel 2

EINGABE
3 2 1 1 2 -1 2 3 -2
AUSGABE
0 -1 -3
main.cpp