C++ 语言 实现 Bellman Ford 算法

C++阿木 发布于 2025-06-14 13 次阅读


Bellman-Ford 算法:C++ 实现与解析

Bellman-Ford 算法是一种用于计算加权图中单源最短路径的算法。它能够处理带有负权边的图,并且能够检测图中是否存在负权环。本文将围绕 Bellman-Ford 算法,使用 C++ 语言进行实现,并对算法的原理、步骤以及代码细节进行详细解析。

算法原理

Bellman-Ford 算法的基本思想是逐步放松图中所有边的权值,直到找到最短路径。算法的步骤如下:

1. 初始化:将源点(起点)到所有其他点的距离初始化为无穷大,源点到自身的距离为 0。
2. 松弛操作:对于图中的每一条边,如果边的起点到终点的距离加上边的权值小于当前终点到起点的距离,则更新终点的距离。
3. 检测负权环:如果经过 n-1 次松弛操作后,仍然存在边使得终点的距离可以进一步减小,则说明图中存在负权环。

C++ 实现步骤

下面是使用 C++ 实现 Bellman-Ford 算法的步骤:

1. 定义图的数据结构。
2. 实现松弛操作。
3. 实现检测负权环的功能。
4. 实现主函数,调用上述功能。

代码实现

cpp
include
include
include

using namespace std;

// 图的边结构
struct Edge {
int src, dest, weight;
};

// 图类
class Graph {
private:
int V, E; // 顶点数和边数
vector edges; // 边列表

public:
Graph(int V, int E) : V(V), E(E) {}

// 添加边
void addEdge(int src, int dest, int weight) {
edges.push_back({src, dest, weight});
}

// Bellman-Ford 算法
void bellmanFord(int src) {
// 初始化距离数组
vector dist(V, INT_MAX);
dist[src] = 0;

// 松弛操作
for (int i = 1; i <= V - 1; ++i) {
for (const Edge& edge : edges) {
int u = edge.src;
int v = edge.dest;
int weight = edge.weight;
if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) {
dist[v] = dist[u] + weight;
}
}
}

// 检测负权环
for (const Edge& edge : edges) {
int u = edge.src;
int v = edge.dest;
int weight = edge.weight;
if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) {
cout << "Graph contains negative weight cycle" << endl;
return;
}
}

// 打印最短路径
for (int i = 0; i < V; ++i) {
cout << "Vertex " << i << " Distance from Source " << src << ": " << dist[i] << endl;
}
}
};

int main() {
// 创建图
Graph g(5, 8);
g.addEdge(0, 1, -1);
g.addEdge(0, 2, 4);
g.addEdge(1, 2, 3);
g.addEdge(1, 3, 2);
g.addEdge(1, 4, 2);
g.addEdge(3, 2, 5);
g.addEdge(3, 1, 1);
g.addEdge(4, 3, -3);

// 执行 Bellman-Ford 算法
g.bellmanFord(0);

return 0;
}

解析

1. 图的数据结构:在上述代码中,我们使用 `vector` 来存储图中的边,其中 `Edge` 结构体包含边的起点、终点和权值。

2. 添加边:`addEdge` 函数用于向图中添加边。

3. Bellman-Ford 算法:`bellmanFord` 函数实现了 Bellman-Ford 算法。初始化距离数组,将源点到自身的距离设为 0,其他距离设为无穷大。然后,进行 n-1 次松弛操作,其中 n 是顶点数。检测是否存在负权环,并打印最短路径。

4. 主函数:在 `main` 函数中,创建一个图实例,添加边,并调用 `bellmanFord` 函数执行算法。

总结

本文介绍了 Bellman-Ford 算法的原理和 C++ 实现步骤。通过代码示例,读者可以了解如何使用 C++ 实现该算法,并理解其工作原理。在实际应用中,Bellman-Ford 算法可以用于解决各种单源最短路径问题,尤其是在存在负权边的情况下。