最短路——Bellman-Ford算法
2018-01-25 14:42
211 查看
由于Dijkstra算法难以解决负环问题,因此有Bellman_Ford算法的使用。当回路中出现负环时,由于n个点,任意一个点最多进行n-1次松弛(可以缩短路径时的操作),所以当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; }
相关文章推荐
- 最短路--Bellman-Ford算法
- 最短路问题 Bellman-Ford算法
- 最短路 bellman-ford算法
- 单源最短路 bellman_ford算法(模板)
- 最短路的Bellman-Ford算法 【判断有无负权环】
- bellman-ford算法(最短路、最短路劲)
- 最短路之Bellman-Ford算法
- 最短路——Bellman-Ford算法
- 最短路——Bellman-ford算法
- C--最短路(Bellman-Ford算法)
- [算法与数据结构] - No.10 图论(3)- 最短路Dijkstra算法、Bellman-Ford算法和Floyd算法
- poj 3259 Wormholes(最短路Bellman-Ford算法)
- bellman-ford算法 最短路
- 单源最短路之bellman-ford算法(解决有负权存在的情况)
- 2544 最短路 Dijkstra算法 Floyd算法 Bellman_Ford算法 SPFA算法
- poj 1860 Currency Exchange (最短路,Bellman-Ford算法)
- 最短路之Bellman-Ford算法
- 单源最短路之spfa算法代码(bellman-ford算法的队列优化)
- 单源最短路 Bellman-Ford算法
- POJ-3259 Wormholes(最短路 Bellman-Ford算法)