3. POSTECH Computer Algorithm Team
- 정점(노드)(vertex)의 개수 V개, 간선(edge)의 개수 M개인 Graph
- 간선 (u, v, t) : u번 노드에서 v번 노드로 가는데 필요한 가중치 t
- 이때, 한 노드에서 다른 노드로 이동하는데 필요한 가중치의 총 합의 최소값을 구하는 방법이다.
Shortest Path Problem (최단 경로 문제)
4. POSTECH Computer Algorithm Team
- 한 종류의 문제를 해결 가능하면 다른 문제들도 해결 가능하므로, 분류에 큰 의미는 없다.
- 단일 출발(single-source) 최단경로
• 단일 노드 v에서 출발하여 그래프 내의 모든 다른 노드에 도착하는 가장 짧은 경로를 찾는 문제.
- 단일 도착(single-destination) 최단경로
• 모든 노드들로부터 출발하여 그래프 내의 한 단일 노드 v로 도착하는 가장 짧은 경로를 찾는 문제.
• 그래프 내의 노드들을 거꾸로 뒤집으면 단일 출발 최단경로문제와 동일.
- 단일 쌍(single-pair) 최단 경로
• 주어진 두 노드 u에서 v까지의 최단 경로를 찾는 문제.
- 전체 쌍(all-pair) 최단 경로
• 그래프 내 모든 노드 쌍들 사이의 최단 경로를 찾는 문제.
최단 경로 문제의 분류
5. POSTECH Computer Algorithm Team
- Optimal substructure
- 최단 경로의 부분 경로는 역시 최단 경로이다.
- 부분 문제가 성립하므로, DP 등을 이용해서 해결 가능하다.
최단 경로 문제의 특성
- 증명
6. POSTECH Computer Algorithm Team
- Edge Relaxation
- 부분 문제가 성립하므로, u에서 v로 가는
edge의 가중치를 더 작은 값으로 업데이트
해도 무방하다.
최단 경로 문제의 특성
7. POSTECH Computer Algorithm Team
- 단일 출발 최단경로 문제를 푸는 알고리즘이다.
- 첫번째 노드(거리를 구하는 시작점)부터 거리가 짧은 순으로 최단 거리를 업데이트해가며 마지막 노드(거리를
구하는 끝점)까지 반복하면, 그게 최단 경로가 된다.
- 즉, 첫번째 노드에서 마지막 노드가 나올 때까지 1. 지금까지 업데이트한것들 중 시작점으로부터 거리가 가장
짧은 노드를 찾고, 2. 그 노드에 연결된 간선들로 다른 노드의 최단거리를 업데이트해주면 된다.
- 만약 음의 가중치를 가지는 간선이 없는 경우, 이 순서대로 업데이트하면 항상 최단경로가 성립하지만, 음의
가중치를 가지는 간선이 있는 경우, 이 알고리즘을 적용할 수 없다. (반례가 존재한다.)
Dijkstra Algorithm
8. POSTECH Computer Algorithm Team
- 최대 V개의 정점에 대해 Extract-Min을 수행
- Extract-Min 을 얼마나 빠르게 하는지가 관건이다.
Dijkstra Algorithm 의사 코드
9. POSTECH Computer Algorithm Team
- 우선, 간선을 한 번씩만 보기 위해 인접 리스트에 간선을 저장하자.
1. 매 정점마다 방문하지 않은 정점 중 시작점으로부터 거리가 가장 짧은 점을 찾는 경우.
- O(V^2 + E)
2. Priority Queue에 거리순으로 정렬되도록 {정점 번호, 거리} 를 넣고, 해당 정점 번호와 인접한
Edge들이 최단경로를 업데이트할 수 있다면 업데이트하는 경우
- 최악의 경우 E개의 원소에 대해 최단경로가 업데이트되므로, 시간복잡도 𝑂 𝐸 log2 𝐸 = 𝑂(𝐸 log2 𝑉)
만에 가능하다.
- E = V^2에 가까우면 1, E = V에 가까우면 2를 사용하면 된다만, PS에서는 2만 알면 된다.
Dijkstra Algorithm 시간 복잡도
10. POSTECH Computer Algorithm Team
- 간선이 음의 가중치를 가지는 경우에 사용된다.
- 그래프 내 모든 간선을 통해, 간선의 시작점과 끝점인 두 정점 (u, v) 사이의 최단경로
를 계속해서 업데이트한다. 그리고 업데이트가 일어나는 동안 반복한다.
- 이렇게만 수행하면 그래프 내에 음의 사이클(Negative Cycle)이 존재하는 경우 Runtime
Error가 발생한다. (최단거리가 음의 무한대가 될 때까지 반복하므로)
• 만약 Negative cycle이 없는 경우, 그래프 모든 정점에 대해 최단경로 업데이트를 시작 노드를
제외한 전체 정점 수(V-1)만큼 반복 수행하면 업데이트가 완료된다.
• 즉, V번 모든 간선에 대해 업데이트를 수행했을 때 마지막 V번째에 업데이트가 일어난다면 위
와 같은 negative cycle이 존재한다.
Bellman-Ford Algorithm
11. POSTECH Computer Algorithm Team
- 모든 간선(E)에 대해 업데이트(V)
를 수행하므로, 시간 복잡도
𝑂(𝑉𝐸) 을 얻는다.
Bellman-Ford Algorithm 의사 코드
12. POSTECH Computer Algorithm Team
Dijkstra, Bellman-Ford Algorithm 비교
- 시간 복잡도로만 비교하면, Dijkstra 알고리즘은 O(ElogV)이고, Bellman-Ford 알고리즘 O(EV)이다.
- 보통 V <= E <= V(V-1)/2 이므로 Dijkstra 알고리즘의 시간복잡도가 Bellman-Ford 알고리즘의 시간복잡도보다 낮
고, 둘 다 적용 가능한 경우에는 Dijkstra 알고리즘이 더 유용하다.
- 만약 음의 간선이 주어지는 경우에는, Negative Cycle이 없다면 Dijkstra 알고리즘은 해결할 수 없지만
Bellman-Ford 알고리즘으로는 해결 가능하다. 이 경우에는 Bellman-Ford 알고리즘이 더 유용하다.
- 그래프가 Negative Cycle을 가지는 경우 이론적으로 음의 무한대의 최단거리를 가지므로 유의미한 문제가 아니다.
13. POSTECH Computer Algorithm Team
- 전체 쌍 최단경로 문제를 해결하는 데에 사용된다.
- 가능한 모든 노드 쌍 (u, v)에 대해 Edge Relaxation을 수행하고 나면 모든 두 노드 (u, v) 간의
거리가 최단경로로 업데이트된 후이다.
- 모든 노드 t에 대해서, 이를 중간 점으로 하여 최단 경로가 되는 노드 쌍 (u, v)가 있다면 이를
업데이트하면 된다. (정당성 증명이 생각만큼 직관적이지 않다. 왜 이 순서로 해야 최단경로가 성
립하는가?)
Floyd-Warshall Algorithm
14. POSTECH Computer Algorithm Team
Floyd-Warshall Algorithm 코드
모든 노드에 대해 삼중 반복문을 돈다.
시간복잡도 𝑂(𝑉3) 이다.
k : Relaxation을 수행할 중간점
I, j : Relaxation을 수행할 시작점, 도착점
15. POSTECH Computer Algorithm Team
각각의 상황에 맞춰서 어떤 알고리즘을 사용해야 하는지 판단해보자.
Algospot :
- 신호 라우팅 (ROUTING)
- 소방차 (FIRETRUCKS)
- 시간여행 (TIMETRIP)
- 선거 공약 (PROMISES)
최단 경로 알고리즘 예제
Baekjoon Online Judge :
분류 – 최단경로 알고리즘 문제들도 필요하면 더 풀어볼 것.
https://www.acmicpc.net/problem/tag/최단%20경로
- Dijkstra 알고리즘을 잘 짰는지 테스트 :
https://www.acmicpc.net/problem/1753
- 거의 최단 경로
- K번째 최단 경로