문제해결 프로그래밍
최단 경로 문제
강원대학교 컴퓨터공학과 최우혁
강의 순서
2
최단 경로 문제Shortest Path Problem
3
최단 경로 문제?
최단 경로 문제Shortest Path Problem
4
최단 경로 문제의 종류
최단 경로 문제Shortest Path Problem
5
단일 출발점 최단 경로 문제를 푸는 대표적 알고리즘
최단 경로 문제Shortest Path Problem
6
다익스트라Dijkstra의 알고리즘
최단 경로 문제Shortest Path Problem
7
다익스트라Dijkstra의 알고리즘: 구현
최단 경로 문제Shortest Path Problem
8
1 import sys
2 import heapq
3
4
5 def dijkstra(G, n):
6 D = [sys.maxsize for _ in range(n)]
7 Y = [False for _ in range(n)]
8 P = [0 for _ in range(n)]
9 Q = []
10
11 D[0] = 0
12 heapq.heappush(Q, (0, 0))
13
14 while Q:
15 d, v = heapq.heappop(Q)
16 Y[v] = True
17 for u, w in G[v].items():
18 if not Y[u] and d + w < D[u]:
19 heapq.heappush(Q, (d + w, u))
20 D[u] = d + w
21 P[u] = v
22
23 return D, P
1 from collections import deque
2
3
4 def path_reconstruction(P, v):
5 path = deque([v])
6 while v != 0:
7 v = P[v]
8 path.appendleft(v)
9 return path
다익스트라Dijkstra의 알고리즘: 예
최단 경로 문제Shortest Path Problem
9
다익스트라Dijkstra의 알고리즘: 예
최단 경로 문제Shortest Path Problem
10
다익스트라Dijkstra의 알고리즘: 예
최단 경로 문제Shortest Path Problem
11
다익스트라Dijkstra의 알고리즘: 예
최단 경로 문제Shortest Path Problem
12
다익스트라Dijkstra의 알고리즘: 예
최단 경로 문제Shortest Path Problem
13
다익스트라Dijkstra의 알고리즘: 경로 출력의 예
최단 경로 문제Shortest Path Problem
14
1 from collections import deque
2
3
4 def path_reconstruction(P, v):
5 path = deque([v])
6 while v != 0:
7 v = P[v]
8 path.appendleft(v)
9 return path
전쌍 최단 경로 문제를 푸는 대표적 알고리즘
최단 경로 문제Shortest Path Problem
15
플로이드Floyd의 알고리즘
최단 경로 문제Shortest Path Problem
16
W | j | |||||
1 | 2 | 3 | 4 | 5 | ||
i | 1 | 0 | 1 | ∞ | 1 | 5 |
2 | 9 | 0 | 3 | 2 | ∞ | |
3 | ∞ | ∞ | 0 | 4 | ∞ | |
4 | ∞ | ∞ | 2 | 0 | 3 | |
5 | 3 | ∞ | ∞ | ∞ | 0 |
D | j | |||||
1 | 2 | 3 | 4 | 5 | ||
i | 1 | 0 | 1 | 3 | 1 | 4 |
2 | 8 | 0 | 3 | 2 | 5 | |
3 | 10 | 11 | 0 | 4 | 7 | |
4 | 6 | 7 | 2 | 0 | 3 | |
5 | 3 | 4 | 6 | 4 | 0 |
P | j | |||||
1 | 2 | 3 | 4 | 5 | ||
i | 1 | -1 | -1 | 3 | -1 | 3 |
2 | 4 | -1 | -1 | -1 | 3 | |
3 | 4 | 4 | -1 | -1 | 3 | |
4 | 4 | 4 | -1 | -1 | -1 | |
5 | -1 | 0 | 3 | 0 | -1 |
플로이드Floyd의 알고리즘: 아이디어
최단 경로 문제Shortest Path Problem
17
플로이드Floyd의 알고리즘: 아이디어
최단 경로 문제Shortest Path Problem
18
플로이드Floyd의 알고리즘: 재귀 관계의 예
최단 경로 문제Shortest Path Problem
19
플로이드Floyd의 알고리즘: 재귀 관계의 예
최단 경로 문제Shortest Path Problem
20
플로이드Floyd의 알고리즘: 재귀 관계의 예
최단 경로 문제Shortest Path Problem
21
플로이드Floyd의 알고리즘: 재귀 관계의 예
최단 경로 문제Shortest Path Problem
22
플로이드Floyd의 알고리즘: 재귀 관계의 예
최단 경로 문제Shortest Path Problem
23
플로이드Floyd의 알고리즘: 재귀 관계의 예
최단 경로 문제Shortest Path Problem
24
플로이드Floyd의 알고리즘: 재귀 관계
최단 경로 문제Shortest Path Problem
25
D[k][i][j] = D[k-1][i][j]
플로이드Floyd의 알고리즘: 재귀 관계
최단 경로 문제Shortest Path Problem
26
D[k][i][j] = D[k-1][i][k] + D[k-1][k][j]
플로이드Floyd의 알고리즘: 재귀 관계
최단 경로 문제Shortest Path Problem
27
D[k][i][j] = min(D[k-1][i][j], D[k-1][i][k] + D[k-1][k][j])
D[i][j] = min(D[i][j], D[i][k] + D[k][j])
플로이드Floyd의 알고리즘: 구현
최단 경로 문제Shortest Path Problem
28
1 def floyd(W, n):
2 D = [[0 for _ in range(n)] for _ in range(n)]
3 P = [[-1 for _ in range(n)] for _ in range(n)]
4
5 for i in range(n):
6 for j in range(n):
7 D[i][j] = W[i][j]
8
9 for k in range(n):
10 for i in range(n):
11 for j in range(n):
12 if D[i][k] + D[k][j] < D[i][j]:
13 D[i][j] = D[i][k] + D[k][j]
14 P[i][j] = k
15 return D, P
1 def path_reconstruction(P, i, j, path):
2 if P[i][j] == -1:
3 path.append(u)
4 return
5 path_reconstruction(P, i, P[i][j], path)
6 path_reconstruction(P, P[i][j], j, path)
플로이드Floyd의 알고리즘: 최단 경로 출력
최단 경로 문제Shortest Path Problem
29
1 def floyd(W, n):
2 D = [[0 for _ in range(n)] for _ in range(n)]
3 P = [[-1 for _ in range(n)] for _ in range(n)]
4
5 for i in range(n):
6 for j in range(n):
7 D[i][j] = W[i][j]
8
9 for k in range(n):
10 for i in range(n):
11 for j in range(n):
12 if D[i][k] + D[k][j] < D[i][j]:
13 D[i][j] = D[i][k] + D[k][j]
14 P[i][j] = k
15 return D, P
1 def path_reconstruction(P, i, j, path):
2 if P[i][j] == -1:
3 path.append(u)
4 return
5 path_reconstruction(P, i, P[i][j], path)
6 path_reconstruction(P, P[i][j], j, path)
단일 도착점 최단 경로 문제를 푸는 대표적 알고리즘?
최단 경로 문제Shortest Path Problem
30
문제: 소방서Fire Station
31
설명
문제: 소방서Fire Station
32
예시
문제: 소방서Fire Station
입력
출력
33
2
1 6
2
1 2 10
2 3 10
3 4 10
4 5 10
5 6 10
6 1 10
1 6
2
1 2 10
2 3 10
3 4 10
4 5 10
5 6 10
6 1 10
5
5
테스트 케이스 개수
소방서의 개수, 교차로의 개수
새 소방서의 교차로 번호
소방서가 위치한 교차로 번호
한 교차로 번호,
다른 교차로 번호,
도로의 길이
다음 테스트 케이스
다음 테스트케이스의 답
힌트
문제: 소방서Fire Station
34
문제: 황혼에서 새벽까지
From Dusk Till Dawn
35
설명
문제: 황혼에서 새벽까지From Dusk Till Dawn
36
설명
문제: 황혼에서 새벽까지From Dusk Till Dawn
37
예시
문제: 황혼에서 새벽까지From Dusk Till Dawn
입력
출력
38
2
3
Ulm Muenchen 17 2
Ulm Muenchen 19 12
Ulm Muenchen 5 2
Ulm Muenchen
10
Lugoj Sibiu 12 6
Lugoj Sibiu 18 6
Lugoj Sibiu 24 5
Lugoj Medias 22 8
Lugoj Medias 18 8
Lugoj Reghin 17 4
Sibiu Reghin 19 9
Sibiu Medias 20 3
Reghin Medias 20 3
Reghin Bacau 24 6
Lugoj Bacau
Test Case 1.
There is no route Vladimir can take.
Test Case 2.
Vladimir needs 2 litre(s) of blood.
테스트케이스 개수
열차 노선의 개수
열차 노선
(출발 도시, 도착 도시, 출발 시각, 소요 시간)
출발 도시와 목적 도시
다음 테스트케이스
여행 경로가 존재할 시 필요한 최소한의 피
테스트케이스 번호
여행 경로가 없을 시
힌트
문제: 황혼에서 새벽까지From Dusk Till Dawn
39
문제: 티모의 여행Teemo’s Trip
40
설명
문제: 티모의 여행Teemo’s Trip
41
설명
문제: 티모의 여행Teemo’s Trip
42
예시
문제: 티모의 여행Teemo’s Trip
입력
출력
43
10 20 3
1 3 50
1 8 3
1 10 15
2 10 37
2 9 42
2 9 14
2 3 44
2 8 26
3 6 80
3 6 60
3 7 12
3 9 66
3 4 81
4 8 6
5 10 45
5 6 73
6 7 83
6 7 83
7 10 14
8 10 59
0
도시의 수, 도로의 수, 버섯의 수
바다가 있는 도시로 가기 위해 필요한 최소 비용
i번째 도시와 j번째 도시를 연결하는 도로의 비용
힌트
문제: 티모의 여행Teemo’s Trip
44
힌트
문제: 티모의 여행Teemo’s Trip
45