最短路径:Bellman-Ford算法
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;//起点到自己距离为0
ford();
for (int i = 1; i <= n; i++) {
cout << dist[i] << " ";
}
return 0;
}
Bellman-Ford算法的作用与分析
根据代码可知,该算法的时间复杂度为O(n*m),它能用来判断负权环的存在,同时也能处理负边权。