|
| 1 | +# 최단경로 알고리즘이란 |
| 2 | + |
| 3 | +그래프에서 간선의 가중치의 합이 최소가 되는 경로를 찾는 알고리즘 |
| 4 | + |
| 5 | +# 최단 경로 문제 종류 |
| 6 | + |
| 7 | +- 단일 출발 (single-source) 최단 경로 |
| 8 | + - 하나의 정점에서 출발하여 나머지 모든 정점 까지의 최단 경로를 찾는 문제 |
| 9 | +- 단일 도착 (single-destination) 최단 경로 |
| 10 | + - 모든 정점에서 출발하여 어떤 하나의 정점까지의 최단 경로를 찾는 문제 |
| 11 | + - 그래프 내의 간선들을 뒤집으면 단일 출발 최단거리 문제로 바뀔 수 있다. |
| 12 | +- 단일 쌍(single-pair) 최단 경로 |
| 13 | + - 모든 정점 쌍들 사이의 최단 경로를 찾는 문제 |
| 14 | + |
| 15 | +# 최단경로 알고리즘 3개 표로 비교하기 |
| 16 | + |
| 17 | +| 특징 | 다익스트라 (Dijkstra) | 플로이드-워셜 (Floyd-Warshall) | 벨만-포드 (Bellman-Ford) | |
| 18 | +| -------------------- | ------------------------------------------------- | --------------------------------------- | ------------------------------------------------- | |
| 19 | +| **용도** | 단일 시작점 최단 경로 | 모든 쌍 최단 경로 | 단일 시작점 최단 경로 | |
| 20 | +| **그래프 유형** | 가중치가 비음수 | 음수 사이클이 없는 그래프 | 음수 가중치 허용 (음수 사이클 탐지 가능) | |
| 21 | +| **시간 복잡도** | \(O((V + E) \log V)\) (우선순위 큐 사용 시) | \(O(V^3)\) | \(O(V \cdot E)\) | |
| 22 | +| **공간 복잡도** | \(O(V + E)\) | \(O(V^2)\) | \(O(V)\) | |
| 23 | +| **음수 가중치** | 허용하지 않음 | 허용하지만 음수 사이클은 없음 | 허용 | |
| 24 | +| **음수 사이클 탐지** | 불가능 | 불가능 | 가능 | |
| 25 | +| **알고리즘 유형** | 탐욕 알고리즘 | 동적 프로그래밍 | 동적 프로그래밍 | |
| 26 | +| **적용 사례** | 네트워크 라우팅, 길 찾기 | 모든 정점 간의 최단 경로 계산 | 금융 모델, 네트워크에서의 비용 최적화 문제 | |
| 27 | +| **입력** | 단일 시작 정점 | 모든 정점 쌍 | 단일 시작 정점 | |
| 28 | +| **출력** | 시작 정점으로부터 각 정점까지의 최단 거리 및 경로 | 모든 정점 쌍 간의 최단 거리와 경로 행렬 | 시작 정점으로부터 각 정점까지의 최단 거리 및 경로 | |
| 29 | + |
| 30 | +# 다익스트라 알고리즘 to Javascript |
| 31 | + |
| 32 | +```javascript |
| 33 | +//그래프 배열 |
| 34 | +const graph = Array.from({ length: n + 1 }, () => []); |
| 35 | +//거리 배열 |
| 36 | +const d = Array.from({ length: n + 1 }, () => Infinity); |
| 37 | + |
| 38 | +//그래프 구성 |
| 39 | +for (const v of arr) { |
| 40 | + const [from, to, dist] = v; |
| 41 | + graph[from].push([to, dist]); |
| 42 | +} |
| 43 | + |
| 44 | +//우선순위 큐 init |
| 45 | +const queue = []; |
| 46 | +//시작점과 weight를 큐에 푸시한다. |
| 47 | +queue.push([start, 0]); |
| 48 | +d[start] = 0; |
| 49 | + |
| 50 | +while (queue.length !== 0) { |
| 51 | + const [curNode, dist] = queue.shift(); //큐에서 가장 최소 요소를 꺼낸다. |
| 52 | + |
| 53 | + if (d[curNode] < dist) continue; //최소 경로를 찾는 부등호 |
| 54 | + |
| 55 | + for (const v of graph[curNode]) { |
| 56 | + // 인접 정접 for loop |
| 57 | + const node = v[0]; |
| 58 | + // 거리 계산 |
| 59 | + const cost = dist + v[1]; |
| 60 | + |
| 61 | + if (cost < d[node]) { |
| 62 | + //계산 중인 경로가 최소경로라면 큐에 푸시 |
| 63 | + queue.push([node, cost]); |
| 64 | + queue.sort((a, b) => a[1] - b[1]); |
| 65 | + d[node] = cost; |
| 66 | + } |
| 67 | + } |
| 68 | +} |
| 69 | +``` |
0 commit comments