728x90
반응형
https://www.acmicpc.net/problem/1005
1005번: ACM Craft
첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N과 건물간의 건설순서 규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부
www.acmicpc.net



풀이
해당 문제는 위상 정렬에 다이나믹 프로그래밍을 같이 사용해야 하는 문제이다.
왜냐하면 각 건물과의 연결을 생각해야하고 이 때 각 건물까지의 거리를 계산해야 한다.
여기서 건물까지의 거리를 계산할 때 다이나믹 프로그래밍을 이용하여 배열에 저장하고
이전에 나왔던 값이 필요 할땐 다시 계산할 필요없이 저장된 값을 가져오게 해야 하기 때문이다.
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
from collections import deque
input=sys.stdin.readline
for _ in range(int(input())):
n,k=map(int, input().split())
#각 건물마다 짓는 딜레이 저장하기 위한 배열
#0을 앞에 넣어주고 extend로 추가하는 이유는
#인덱스를 건물의 숫자와 맞추기 위해 0번째의 인덱스에
#0을 넣고 1번 인덱스부터 데이터 추가
delay=[0]
delay.extend(list(map(int,input().split())))
#각 건물과 연결된 건물을 저장하기 위한 리스트
graph=[[] for i in range(n+1)]
#처음부터 해당 건물까지 짓기 위한 시간을 저장할 리스트
distance=[0]*(n+1)
#해당 건물 이전에 지어야 할 건물 수 카운트
check=[0]*(n+1)
for i in range(k):
x,y=map(int,input().split())
graph[x].append(y)
check[y]+=1
taget=int(input())
deq=deque()
for i in range(1,n+1):
if check[i]==0:
deq.append(i)
#check[i]가 0이면 이전에 지어야 하는 건물이
#없기 때문에 거리는 해당 건물의 딜레이 시간과 같음
distance[i]=delay[i]
while deq:
a=deq.popleft()
#taget건물이 pop된건 지어진것을 뜻하므로 break
if a==taget:
break
for i in graph[a]:
#i의 거리가 0이면 처음 방문하기 때문에 거리는
#이전 건물의 거리 + 현재 건물의 딜레이
if distance[i] == 0:
distance[i] = distance[a] + delay[i]
#해당 건물의 거리가 0이 아니면 이미 방문했다는 의미이다.
#여기서 해당 건물이 짓기 위해서는 이전에 연결된 건물들을
#모두 지어야 하므로 저장된 거리와 다른 연결된 거리를 비교하여
#큰 값을 저장
else:
distance[i] = max(distance[i], distance[a] + delay[i])
check[i]-=1
if check[i]==0:
deq.append(i)
print(distance[taget])
|
cs |
728x90
반응형
'Python3 > 백준 알고리즘' 카테고리의 다른 글
2022.02.17 [백준] (python 파이썬) 보석 도둑 (0) | 2022.02.17 |
---|---|
2022.02.17 [백준] (python 파이썬) 게임 개발 (0) | 2022.02.17 |
2022.02.17 [백준] (python 파이썬) 줄 세우기 (0) | 2022.02.17 |
2022.02.16 [백준] (python 파이썬) 문제집 (0) | 2022.02.16 |
2022.02.16 [백준] (python 파이썬) 카드 정렬하기 (0) | 2022.02.16 |
댓글