최단 경로
Updated:
강의 사이트
- http://www.kocw.net/home/search/kemView.do?kemId=1148815
최단경로
1. 최단경로
- 가중치 (방향) 그래프 G=(V,E), 즉 모든 에지에 가중치가 있음
- (무방향 그래프는 방향그래프랑 같다고 보면 됨. 양쪽으로 지나갈 수 있기에)
- 경로 p=(v0,v1,…,vk)의 길이는 경로상의 모든 에지의 가중치의 합
- 노드 u에서 v까지의 최단경로의 길이를 델타(u, v)라고 표시하자.
2. 유형
- Single-source: (one to all)
- 하나의 출발 노드 s로부터 다른 모든 노드까지의 최단 경로를 찾아라.
- 예: Dijkstra(다익스트라)의 알고리즘
- Single-destination: (one to all)
- 모든 노드로부터 하나의 목적지 노드까지의 최단 경로를 찾아라.
- Single-source 문제와 동일
- 거꾸로 생각하면 single-source와 같다.
- Single-pair: (one to one)
- 주어진 하나의 출발 노드 s로 부터 하나의 목적지 노드 t까지의 최단 경로를 찾아라
- 최악의 경우 시간복잡도에서 Single-source 문제보다 나은 알고리즘이 없음
- single-source를 구하다가 목적지가 t인 경로였다면 끝. 그래서 별게 없다.
- All-pairs: (all to all)
- 모든 노드 쌍에 대해서 최단 경로를 찾아라.
- floyd
3. 음수 가중치
- 가중치는 보통 거리, 비용을 의미하므로 보통은 음수가 없다고 가정
- 그러나 알고리즘에 따라 음수 가중치가 있어도 가능. 아닐 수도 있고. 100%는 아니라는 얘기
4. 기본 특성
- 최단 경로의 어떤 부분경로도 역시 최단 경로이다.
- 최단 경로는 사이클을 포함하지 않는다. (음수 사이클이 없다는 가정하에서)
5. Single-source 최단경로 문제
- 입력: 음수 사이클이 없는 가중치 방향그래프 G=(V,E)와 출발 노드 s∈V
- 목적: 각 노드 v∈V에 대해서 다음을 계산한다.
- d[v] : distance estimate(거리측정이라 부름)
- 처음에는 d[s]=0, d[v]=∞로 시작한다.
- 알고리즘이 진행됨에 따라서 d[v]는 감소해간다. 하지만 항상 d[v]≥δ(s,v)를 유지한다
- 최종적으로는 d[v]=δ(s,v)가 된다.
- 예를 들어 d[v] = 5라고 한다면 노드 s에서 v노드까지 거리가 5라는 이야기이다.
- 꼭 direct가 아니고 여러 노드를 걸쳐서 총 합의 최솟값을 말하는 것이다.
- 자세한 예는 6번을 보자
- π[v]:
- s에서 v까지의 최단경로상에서 v의 직전 노드(predecessor)
- 그런 노드가 없는 경우 π[v]=NIL
- d[v] : distance estimate(거리측정이라 부름)
6. 기본연산 : Relaxation
-
어떤 엣지에 대해서 relax한다.
- 엣지 (u, v)에 대해서 relaxe한다. 무슨 의미이냐.
- d[u] = 5, d[v] = 9는 각각 노드 S(출발지)에서 해당 노드까지 걸리는 최종 최소 거리 값이다.
- 따라서 d[u] = 5는 노드 s에서 u까지 5의 거리는 의미이다.
- 똑같이 d[v] = 9는 노드 s에서 v까지 9의 거리를 의미한다.
- 이때 u에서 v까지 가는 거리가 2라고 한다고 하자.
- 그러면 s에서 v까지 가는 거리가 9였는데 u를 지나처 v로 간다면 경로고 7이 된다.
- 따라서 d[v]는 7이 된다.
- 이를 relax한다라고 한다. (여기까지가 왼쪽 그림)
- 오른쪽 그림의 경우 relax해도 경로가 더 커지므로 그냥 내비둔다.
7. 기본 알고리즘 (Bellman-Ford 알고리즘)
- 대부분의 single-source 최단경로 알고리즘의 기본 구조
- 초기화: d[s]=0, 노드 v≠s에 대해서 d[v]=∞,π[v]=NIL.
- 에지들에 대한 반복적인 relaxation
- 알고리즘들 간의 차이는 어떤 에지에 대해서, 어떤 순서로 relaxation 을 하느냐에 있음
- 일반적인 single-source 알고리즘이다.
- 여기서 변형시켜 나간다.
- 1줄은 초기화. d[s]=0, 노드 v≠s에 대해서 d[v]=∞,π[v]=NIL
- 3줄 부터. 각 엣지에 대해서 relax한다.
- 5줄은 3줄에서 각 엣지에 대해서 relax에 했을 때 노드에 있는 relax한 값들이 변하지 않았다면 종료.
- 아니면 다시 3번으로 가서 relax를 반복
7.1 최단 경로가 되는 이유
-
어떤 그래프에서 s에서 v까지 최단 경로로 갈때 가장 많이 지날 경로의 수는 n-1개 이다. (N은 엣지의 갯수)
- 첫 번째 반복일 때 d[s] = 0이고 d[v1]= w(s, v1) 이다. 이는 s에서 v까지의 최단 경로에서 s에서 v1로 가는 경로가 최단 부분 경로라는 것을 확인 할 수 있다.
- 두 번째 반복일 때 relax가 되어 d[v2] = d[v1] + w(v1, v2)이다.
- 이런 식으로 반복하면 n-1 반복으로 충분하며 최단 경로가 찾아진다.
7.2 Pseudo Code
-
5번째 줄부터는 음수 사이클을 확인 하는 용도
-
그래서 시간복잡도는 N-1 * M 즉, O(n*M)이다. M은 각 노드들이 가지고 있는 엣지의 개수
7.3 예시
7.4 최악의 시나리오
- S에서 V까지 가는 경로가 5가지라고 가정하자.
- 처음 relax가 일어나면 V는 1000이 된다. 첫 번째 경로의 노드는 400, 그다음은 200.. 이렇게 된다.
- 다음 relax가 일어나면 v는 800이 된다. 그러면 처음 relax가 되어 v가 1000이 되었을 때 v로부터 시작되는 엣지들은 1000인줄 알고 계산이 되었는데 800으로 바뀌니 또 다 계산 되어야 한다.
- 하지만 3번째 relax가 일어나면 v는 500이 되고 또 v에서 시작하는 엣지들은 500으로 다 계산되어야 한다.