백준 2637번 python 풀이 - 장난감 조립
문제 링크
해결책
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
import sys
N = int(sys.stdin.readline().rstrip())
M = int(sys.stdin.readline().rstrip())
indegree = [0 for _ in range(N + 1)]
path = [[] for _ in range(N + 1)]
for _ in range(M):
_to, _from, val = map(int, sys.stdin.readline().rstrip().split())
path[_from].append((_to, val))
indegree[_to] += 1
path[_from].sort(key=lambda x: x[0])
que = []
base = []
for _ in range(1, N + 1):
if indegree[_] == 0:
que.append(_)
base.append(_)
needs = [[0 for i in range(N + 1)] for j in range(N + 1)]
while que:
cur_v = que.pop(0)
for nxt_v, nxt_w in path[cur_v]:
if (cur_v in base):
needs[nxt_v][cur_v] += nxt_w
else:
for i in range(1, N + 1):
needs[nxt_v][i] += needs[cur_v][i] * nxt_w
indegree[nxt_v] -= 1
if indegree[nxt_v] == 0:
que.append(nxt_v)
for i in base:
print(i, needs[-1][i])
주석으로 달 설명
으악 위상정렬 2번… 위상 정렬 자체는 어렵지 않은데, 뭔가 이런식으로 꼬이기 시작하면 밑도끝도없이 내려간다… 여기에서의 포인트는, indegree가 0인 놈들을 넣는것 뿐만 아니라, 조금의 DP와 함께 기존값을 저장하여, 이 저장된 것들을 집어넣어주는것이 포인트였다.
This post is licensed under CC BY 4.0 by the author.