반응형
✅ 벨먼-포드 알고리즘 (Bellman-Ford Algorithm)
❕ 기본 개념
- 그래프의 최단 경로 문제를 해결하기 위한 알고리즘
- 최단 경로 문제에서는 간선에 가중치가 부여된 가중 그래프가 주어지며,
시작점부터 종점까지의 경로 중 간선의 가중치 최소합을 구하면 됨
- 가중치가 음수라도 제대로 동작함
- 방향성/비방향성 그래프 모두 적용 가능
- 정점 수를 n, 간선 수를 m이라고 할 때, 가중치 변경 작업을 n회 순회하고,
각 변경 작업에서 각 간선을 1회씩 조사하므로 전체 계산 시간은 O(nm)
❕ 작동 방식







✔ 구현 방법 (JS)
function BellmanFord(graph, V, E, src) { // Initialize distance of all vertices as infinite. var dis = Array(V).fill(1000000000); // initialize distance of source as 0 dis[src] = 0; // Relax all edges |V| - 1 times. A simple // shortest path from src to any other // vertex can have at-most |V| - 1 edges for (var i = 0; i < V - 1; i++) { for (var j = 0; j < E; j++) { if (dis[graph[j][0]] + graph[j][2] < dis[graph[j][1]]) dis[graph[j][1]] = dis[graph[j][0]] + graph[j][2]; } } // check for negative-weight cycles. // The above step guarantees shortest // distances if graph doesn't contain // negative weight cycle. If we get a // shorter path, then there is a cycle. for (var i = 0; i < E; i++) { var x = graph[i][0]; var y = graph[i][1]; var weight = graph[i][2]; if (dis[x] != 1000000000 && dis[x] + weight < dis[y]) document.write("Graph contains negative" + " weight cycle<br>"); } document.write("Vertex Distance from Source<br>"); for (var i = 0; i < V; i++) document.write(i + " " + dis[i] + "<br>"); } // Driver code var V = 5; // Number of vertices in graph var E = 8; // Number of edges in graph // Every edge has three values (u, v, w) where // the edge is from vertex u to v. And weight // of the edge is w. var graph = [ [0, 1, -1], [0, 2, 4], [1, 2, 3], [1, 3, 2], [1, 4, 2], [3, 2, 5], [3, 1, 1], [4, 3, -3], ]; BellmanFord(graph, V, E, 0); /* Output Vertex Distance from Source 0 0 1 -1 2 2 3 -2 4 1 */
참고자료
「알고리즘 도감」 中 4-4 벨먼-포드 알고리즘
https://www.programiz.com/dsa/bellman-ford-algorithm
https://wch18735.github.io/algorithm/Bellman_Ford/
https://www.geeksforgeeks.org/bellman-ford-algorithm-simple-implementation/
반응형
'Devlog > DS & Algorithms' 카테고리의 다른 글
[알고리즘] 이진 탐색 (0) | 2022.08.16 |
---|---|
[알고리즘] Greedy Algorithm (0) | 2022.08.06 |
[알고리즘] Dynamic Programming (0) | 2022.08.06 |
[알고리즘] 계수 정렬 (0) | 2022.08.06 |
[알고리즘] 퀵 정렬 (0) | 2022.08.05 |