반응형

   문제

   https://www.acmicpc.net/problem/1005




동적계획법을 적용하여 구하는 위상정렬이다.

위상 정렬에서 큐에서 값들을 뺄때 진입차수 뿐만 아니라 이전 건물까지 걸리는 

시간+이번 건물을 짓는 시간과 이전 DP값을 비교하여 더 오래 걸리는시간으로 갱신해

주면된다. 해당 건물이 지어지기위해서는 앞에 지어질 건물들의 걸리는 시간들 중에서 

가장 긴 시간에 맞춰주어야 모든 건물을 짓고 해당 건물을 지을 수 있기 때문이다.



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
import sys
from collections import deque
 
T=int(sys.stdin.readline())
 
for _ in range(T):
    N,K=map(int,sys.stdin.readline().split())#건물수 건물간의 건설순서규칙
    building=[0]+list(map(int,sys.stdin.readline().split()))#각 건물들의 건설시간
    tree=[[] for _ in range(N+1)]#건설순서규칙
    inDegree=[0 for _ in range(N+1)]#진입차수
    DP=[0 for _ in range(N+1)]#해당 건물까지 걸리는 시간
 
    for _ in range(K):#건설규칙 저장
        a,b=map(int,sys.stdin.readline().split())
        tree[a].append(b)
        inDegree[b]+=1
 
    q = deque()
    for i in range(1,N+1):#진입차수 0인거 찾아서 큐에 넣기
        if inDegree[i]==0:
            q.append(i)
            DP[i]=building[i]
 
    while q:
        a=q.popleft()
        for i in tree[a]:
            inDegree[i]-=1#진입차수 줄이고 비용갱신
            DP[i]=max(DP[a]+building[i],DP[i])#DP를 이용해 건설비용 갱신
            if inDegree[i]==0:
                q.append(i)
 
 
    answer=int(sys.stdin.readline())
    print(DP[answer])
 

cs








반응형

'알고리즘(python) > 정렬' 카테고리의 다른 글

[Python]위상정렬 백준 1766  (0) 2020.04.14
[Python]위상정렬 백준 3665  (0) 2020.04.13
[Python]위상정렬 백준 2252  (0) 2020.04.12
[Python]정렬 백준 10814  (0) 2020.01.02
[Python]정렬 백준 1181  (0) 2020.01.02
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기