您的位置:首页 > 其它

最短路——Bellman-Ford算法

2018-01-25 14:42 211 查看
由于Dijkstra算法难以解决负环问题,因此有Bellman_Ford算法的使用。当回路中出现负环时,由于n个点,任意一个点最多进行n-1次松弛(可以缩短路径时的操作),所以当n-1次松弛之后进行判断能否再次松弛,如果可以就说明出现负环。而这个算法的缺点是时间复杂度是立方级别的。

进行n-1次松弛:

for(int k = 1; k <= poi_num - 1; k++){
for(int j = 1; j <= poi_num; j++){
for(int i = 1; i <= poi_num; i++){
if(map[i][j] != Max && d[i] != Max && d[j] > d[i] + map[i][j]){
d[j] = d[i] + map[i][j];
}
}
}
}


再次判断是否能松弛:

for(int i = 1; i <= poi_num; i++){
for(int j = 1; j <= poi_num; j++){
if(map[i][j] != Max && d[i] != Max && d[j] > d[i] + map[i][j]){
change = 0;
}
}
}


完整代码:

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;

const int Max = 0x3f3f3f3f;

int map[1005][1005];
int d[1005];

void init(int n){
for(int i = 0; i <= n; i++){
d[i] = Max;
for(int j = 0; j <= n; j++){
map[i][j] = Max;
}
}
}

int main(){
int poi_bgn, poi_nd, edge_n, poi_n;
cin >> poi_n >> edge_n;
init(poi_n);
for(int i = 0; i < edge_n; i++){
int poi_a, poi_b, edge_len;
cin >> poi_a >> poi_b >> edge_len;
map[poi_a][poi_b] = edge_len;
map[poi_b][poi_a] = edge_len;
}
cin >> poi_bgn >> poi_nd;
for(int i = 1; i <= poi_n; i++){
d[i] = map[poi_bgn][i];
}
d[poi_bgn] = 0;
for(int k = 1; k < poi_n; k++){
for(int i = 1; i <= poi_n; i++){
for(int j = 1; j <=poi_n; j++){
if(map[i][j] != Max && d[i] != Max && d[j] > d[i] + map[i][j]){
d[j] = map[i][j] + d[i];
}
}
}
}
bool flag = 0;
for(int i = 1; i <= poi_n; i++){
for(int j = 1; j <= poi_n; j++){
if(map[i][j] != Max && d[i] != Max && d[j] > d[i] + map[i][j]){
flag = 1;
break;
}
}
}
if(flag){
cout << -1 << endl;
}
else{
cout << d[poi_nd] << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: