Post

백준 1948번 python 풀이 - 임계 경로

문제 링크

1948번

해결책

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import sys

n = int(sys.stdin.readline().rstrip())
m = int(sys.stdin.readline().rstrip())

to_city = [[] for i in range(n + 1)]
back_city = [[] for i in range(n + 1)]

indegree = [0 for i in range(n + 1)]

max_weights = [0 for i in range(n + 1)]

is_visited = [[False for j in range(n + 1)] for i in range(n + 1)]
line_cnt = 0

def recur_bfs(cur, weight):
    global line_cnt

    for pa, val in back_city[cur]:
        if weight == max_weights[pa] + val and is_visited[cur][pa] is False:
            line_cnt += 1
            to_visit.append((pa, weight - val))
            is_visited[cur][pa] = True

for _ in range(m):
    _from, _to, weight = map(int, sys.stdin.readline().rstrip().split())
    to_city[_from].append((_to, weight))
    back_city[_to].append((_from, weight))
    indegree[_to] += 1

start, end = map(int, sys.stdin.readline().rstrip().split())

que = [start]
ans_path = []

while que:
    cur = que.pop(0)
    for pa, val in to_city[cur]:
        max_weights[pa] = max(max_weights[pa], max_weights[cur] + val)
        indegree[pa] -= 1
        if (indegree[pa] == 0):
            que.append(pa)

final_weight = max_weights[end]


to_visit = [(end, final_weight)]

while to_visit:
    cur_v, cur_weight = to_visit.pop(0)
    recur_bfs(cur_v, cur_weight)


print(final_weight)
print(line_cnt)

주석으로 달 설명

목적지로 가는 경로의 수를 위상정렬로 해결하였고, 이후 목적지까지 가는 길의 량을 BFS를 이용해 해결하였다. 근데 얘기를 들어보니… 목적지까지 가는 길 역시 outdegree를 이용한 위상 정렬으로 해결할 수 있다고 한다.

This post is licensed under CC BY 4.0 by the author.