Búsqueda del camino más largo en un grafo usando STL y ordenamiento topológico

C++ Hard STL

Tarea «Búsqueda del camino más largo en un grafo usando STL y ordenamiento topológico»

Dado un grafo acíclico dirigido (DAG) con N vértices y M aristas. Cada arista tiene un peso entero (puede ser negativo). Es necesario encontrar la longitud del camino más largo desde un vértice inicial dado S hasta todos los demás vértices. Si un vértice es inalcanzable, mostrar «INF». Utilice ordenamiento topológico (algoritmo de Kahn) y programación dinámica. Restricciones: N ≤ 10^5, M ≤ 2*10^5, pesos en módulo ≤ 10^9. Se garantiza que el grafo no contiene ciclos.

Formato de entrada

Primera línea: N M S (1 ≤ N ≤ 100000, 0 ≤ M ≤ 200000, 1 ≤ S ≤ N). Las siguientes M líneas: u v w (1 ≤ u, v ≤ N, -10^9 ≤ w ≤ 10^9).

Formato de salida

Imprima N líneas: para cada vértice i (de 1 a N) imprima la longitud del camino más largo desde S hasta i, o «INF» si el vértice es inalcanzable. La longitud del camino desde S hasta S se considera igual a 0.

Ejemplos

Ejemplo 1

ENTRADA
4 3 1 1 2 5 1 3 3 2 4 2
SALIDA
0 5 3 7

Ejemplo 2

ENTRADA
3 2 1 1 2 -1 2 3 -2
SALIDA
0 -1 -3
main.cpp