Поиск самого длинного пути в графе с использованием STL и топологической сортировки
C++
Сложный
STL
Задача «Поиск самого длинного пути в графе с использованием STL и топологической сортировки»
Дан ориентированный ациклический граф (DAG) с N вершинами и M ребрами. Каждое ребро имеет целочисленный вес (может быть отрицательным). Необходимо найти длину самого длинного пути от заданной начальной вершины S до всех остальных вершин. Если вершина недостижима, вывести «INF». Используйте топологическую сортировку (алгоритм Кана) и динамическое программирование. Ограничения: N ≤ 10^5, M ≤ 2*10^5, веса по модулю ≤ 10^9. Гарантируется, что граф не содержит циклов.
Формат ввода
Первая строка: N M S (1 ≤ N ≤ 100000, 0 ≤ M ≤ 200000, 1 ≤ S ≤ N). Следующие M строк: u v w (1 ≤ u, v ≤ N, -10^9 ≤ w ≤ 10^9).
Формат вывода
Выведите N строк: для каждой вершины i (от 1 до N) выведите длину самого длинного пути от S до i, или «INF», если вершина недостижима. Длина пути от S до S считается равной 0.
Примеры
Пример 1
ВВОД
4 3 1
1 2 5
1 3 3
2 4 2
ВЫВОД
0
5
3
7
Пример 2
ВВОД
3 2 1
1 2 -1
2 3 -2
ВЫВОД
0
-1
-3
main.cpp