honey_pot
[그래프] 10 - 4 커리큘럼 본문
온라인으로 총 N개의 강의를 듣고자 한다. 모든 강의는 1번부터 N번까지의 번호를 가진다. 또한 동시에 여러 개의 강의를 들을 수 있다.
각 온라인 강의는 선수 강의가 있을 수 있는데, 선수 강의가 있는 강의는 선수 강의를 먼저 들어야만 해당 강의를 들을 수 있다.
듣고자 하는 N개의 강의 정보가 주어졌을 때, N개의 강의에 대하여 수강하기까지 걸리는 최소 시간을 각각 출력하는 프로그램을 작성하시오
입력 조건
- 첫째 줄에 듣고자 하는 강의의 수 (1<=N<= 500) 이 주어진다.
- 다음 N개의 줄에는 각 강의의 강의 시간과 그 강의를 듣기 위해 먼저 들어야 하는 강의들의 번호가 자연수로 주어지며, 각 자연수는 공백으로 구분한다. 이때 강의 시간은 100,000 이하의 자연수이다.
- 각 강의 번호는 1부터 N까지로 구성되며, 각 줄은 -1로 끝난다.
출력 조건
N개의 강의에 대하여 수강하기까지 걸리는 최소 시간을 한 줄에 하나씩 출력한다.
입력 예시
5
10 -1
10 1 -1
4 1 -1
4 3 1 -1
3 3 -1
출력 예시
10
20
14
18
17
해설
✨ 위상 정렬 알고리즘의 응용문제
👉 각 노드(*강의)에 대하여 인접한 노드를 확인할 때, 인접한 노드에 대하여 현재보다 강의 시간이 더 긴 경우를 찾는다면, 더 오랜 시간이 걸리는 경우의 시간 값을 저장하는 방식으로 결과 테이블을 갱신하여 답을 구한다. 따라서 위상 정렬을 수행하면서, 매번 간선 정보를 확인하여 결과 테이블을 갱신한다.
✨ deepcopy() 함수를 이용하여 time 리스트 변수의 값을 복사하여 result 리스트 변수의 값으로 절정한다.
👉👉 리스트의 경우, 단순히 대입 연산을 하면 값이 변경될 때 문제가 발생할 수 있으므로, 리스트의 값을 복제해야 할 때는 deepcopy() 함수를 사용한다.
from collections import deque
import copy
# 노드의 개수 입력받기
v = int(input())
# 모든 노드에 대한 진입하수는 0으로 초기화
indegree = [0] *(v+1)
# 각 노드에 연결된 간선 정보를 담기 위한 연결 리스트(그래프) 초기화
graph = [[] for i in range(v+1)]
# 각 강의 시간을 0으로 초기화
time = [0] *(v+1)
# 방향 그래프의 모든 간선 정보를 입력받기
for i in range(1, v+1):
data = list(map(int, input().split()))
time[i] = data[0] # 첫번 째 수는 시간 정보를 담고 있음
for x in data[1:-1]:
indegree[i] +=1
graph[x].append(i)
# 위상 정렬 함수
def topology_sort():
result = copy.deepcopy(time) # 알고리즘 수행 결과를 담을 리스트
q = deque()
# 처음 시작할 때는 진입차수가 0인 노드를 큐에 삽입
for i in range(1, v+1):
if indegree[i] == 0:
q.append(i)
while q:
now = q.popleft()
#해당 원소와 연결된 노드들의 진입하수에서 1 빼기
for i in graph[now]:
result[i] = max(result[i], result[now] + time[i])
indegree[i] -=1
# 새롭게 진입하수가 0이 되는 노드를 큐에 삽입
if indegree[i] ==0:
q.append(i)
# 위상 정렬을 수행한 결과 출력
for i in range(1, v+1):
print(result[i])
topology_sort()
'이것이 코딩테스트다' 카테고리의 다른 글
[그래프] 10 - 3 도시 분할 계획 (0) | 2021.06.21 |
---|---|
[그래프] 10 - 2 팀 결성 (0) | 2021.06.21 |
[그래프] 10 - 1 (2) 위상 정렬 (0) | 2021.06.21 |
[그래프] 10 - 1 (2) 신장 트리 (0) | 2021.06.21 |
[그래프] 10 - 1 (1) 서로소 집합 알고리즘 (0) | 2021.06.20 |
Comments