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()