Bellman-Ford的操作步骤
1.初始化距离:将起点的dist值设置为0,其他点的dist值设置为无穷大。
2.执行n-1轮松弛操作:遍历所有边,更新最短距离,收敛后可获得最短路径。
3.检测负权环:额外遍历一次,若还可以进行更新,则说明图中存在负权环。
Bellman-Ford的代码实现
#include<iostream>
#include<cstring>
using namespace std;
int n, m;
int dist[105];
int s;
struct edge {int a, b, w;
}e[10005];
void ford() {//可以判断负边权回路int x, y, w;int flag = 0;for (int i = 1; i <= n - 1; i++) {//循环到n flag为1 负权环回路flag = 0;for (int j = 0; j < m; j++) {x = e[j].a;y = e[j].b;w = e[j].w;if (dist[x] + w < dist[y]) {dist[y] = dist[x] + w;flag = 1;} }if (flag == 0) {break;}}
}
int main() {cin >> n >> m;for (int i = 0; i < m; i++) {cin >> e[i].a >> e[i].b >> e[i].w;}cin >> s;memset(dist, 0x3f, sizeof(dist));dist[s] = 0;//起点到自己距离为0ford();for (int i = 1; i <= n; i++) {cout << dist[i] << " ";}return 0;
}
Bellman-Ford算法的作用与分析
根据代码可知,该算法的时间复杂度为O(n*m),它能用来判断负权环的存在,同时也能处理负边权。