[c++] 벨만-포드 알고리즘(Bellman-Ford Algorithm) 최단 경로 알고리즘
최단 경로 알고리즘은 그래프에서 가장 짧은 경로를 찾는데 사용되는 알고리즘이다. 이 중 벨만-포드 알고리즘은 음의 가중치가 있는 그래프에서도 사용할 수 있는 장점이 있다.
알고리즘 개요
벨만-포드 알고리즘은 시작 노드에서 다른 모든 노드로의 최단 경로를 찾는 알고리즘이다. 음의 가중치가 있는 그래프에서도 사용이 가능하며, 음의 사이클이 없을 경우, 시작 노드로부터 모든 노드로의 최단 경로를 찾을 수 있다.
시간 복잡도
벨만-포드 알고리즘의 시간 복잡도는 O(V*E)이다. 여기서 V는 노드의 수, E는 간선의 수를 나타낸다.
코드 예시
다음은 C++로 작성된 벨만-포드 알고리즘의 간단한 예시이다.
#include <iostream>
#include <vector>
struct Edge {
int source, destination, weight;
};
void bellmanFord(std::vector<Edge> edges, int numNodes, int source) {
std::vector<int> distance(numNodes, INT_MAX);
distance[source] = 0;
for (int i = 1; i <= numNodes - 1; i++) {
for (const auto& edge : edges) {
if (distance[edge.source] != INT_MAX && distance[edge.destination] > distance[edge.source] + edge.weight) {
distance[edge.destination] = distance[edge.source] + edge.weight;
}
}
}
for (const auto& edge : edges) {
if (distance[edge.source] != INT_MAX && distance[edge.destination] > distance[edge.source] + edge.weight) {
std::cout << "Graph contains negative weight cycle" << std::endl;
return;
}
}
for (int i = 0; i < numNodes; i++) {
std::cout << "Distance from node " << source << " to node " << i << " is " << distance[i] << std::endl;
}
}
int main() {
std::vector<Edge> edges = {{0, 1, 4}, {0, 2, 3}, {1, 2, 1}, {1, 3, 2}, {3, 4, 5}, {2, 4, 4}};
int numNodes = 5;
int source = 0;
bellmanFord(edges, numNodes, source);
return 0;
}
요약
벨만-포드 알고리즘은 음의 가중치가 있는 그래프에서도 사용 가능한 최단 경로 알고리즘이다. 알고리즘의 시간 복잡도는 O(V*E)이며, 시작 노드로부터 다른 모든 노드로의 최단 경로를 찾을 수 있다. 그러나 음의 사이클이 있는 경우에는 정확한 결과를 얻을 수 없다.