목차

임계경로

ps
링크acmicpc.net/…
출처BOJ
문제 번호1948
문제명임계경로
레벨플래티넘 5
분류

위상정렬

시간복잡도O(n+m)
인풋사이즈n<=10,000, m<=100,000
사용한 언어Python
제출기록46028KB / 388ms
최고기록220ms
해결날짜2021/10/02

풀이

코드

"""Solution code for "BOJ 1948. 임계경로".

- Problem link: https://www.acmicpc.net/problem/1948
- Solution link: http://www.teferi.net/ps/problems/boj/1948

Tags: [TopologicalSort]
"""

import graphlib
import sys


def main():
    n = int(sys.stdin.readline())
    m = int(sys.stdin.readline())
    ts = graphlib.TopologicalSorter()
    pred_graph = [[] for _ in range(n)]
    for _ in range(m):
        u, v, w = [int(x) for x in sys.stdin.readline().split()]
        ts.add(v - 1, u - 1)
        pred_graph[v - 1].append((u - 1, w))
    start, dest = [int(x) for x in sys.stdin.readline().split()]
    critical_path = [[] for _ in range(n)]
    time = [0] * n
    for u in ts.static_order():
        max_time = 0
        for v, time_vu in pred_graph[u]:
            time_u = time[v] + time_vu
            if time_u == max_time:
                critical_path[u].append(v)
            elif time_u > max_time:
                max_time = time_u
                critical_path[u] = [v]
        time[u] = max_time
    answer = 0
    stack = [dest - 1]
    visited = [False] * n
    while stack:
        u = stack.pop()
        if not visited[u]:
            visited[u] = True
            answer += len(critical_path[u])
            stack.extend(critical_path[u])
    print(time[dest - 1])
    print(answer)


if __name__ == '__main__':
    main()