Busca do caminho mais longo em um grafo usando STL e ordenação topológica

C++ Hard STL

Tarefa «Busca do caminho mais longo em um grafo usando STL e ordenação topológica»

Dado um grafo direcionado acíclico (DAG) com N vértices e M arestas. Cada aresta possui um peso inteiro (podendo ser negativo). É necessário encontrar o comprimento do caminho mais longo do vértice inicial S para todos os outros vértices. Se o vértice for inalcançável, imprima «INF». Use ordenação topológica (algoritmo de Kahn) e programação dinâmica. Restrições: N ≤ 10^5, M ≤ 2*10^5, pesos em módulo ≤ 10^9. Garante-se que o grafo não contém ciclos.

Formato de Entrada

Primeira linha: N M S (1 ≤ N ≤ 100000, 0 ≤ M ≤ 200000, 1 ≤ S ≤ N). Próximas M linhas: u v w (1 ≤ u, v ≤ N, -10^9 ≤ w ≤ 10^9).

Formato de Saída

Imprima N linhas: para cada vértice i (de 1 a N) imprima o comprimento do caminho mais longo de S até i, ou «INF» se o vértice for inalcançável. O comprimento do caminho de S até S é considerado 0.

Exemplos

Exemplo 1

ENTRADA
4 3 1 1 2 5 1 3 3 2 4 2
SAÍDA
0 5 3 7

Exemplo 2

ENTRADA
3 2 1 1 2 -1 2 3 -2
SAÍDA
0 -1 -3
main.cpp