Bellman-Ford 算法 *
Bellman-Ford算法可以大致分为三个部分
第一,初始化所有点。每一个点保存一个值,表示从原点到达这个点的距离,将原点的值设为0,其它的点的值设为无穷大(表示不可达)。
第二,进行循环,循环下标为从1到n-1(n等于图中点的个数)。在循环内部,遍历所有的边,进行松弛计算。
第三,遍历途中所有的边(edge(u,v)),判断是否存在这样情况:
d(v) > d (u) + w(u,v)
则返回false,表示途中存在从源点可达的权为负的回路。
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int maxnum=100; 7 const int maxint=0x3f3f3f; 8 typedef struct Edge{ 9 int u, v; 10 int weight; 11 }Edge; 12 13 Edge edge[maxnum]; 14 int dist[maxnum]; 15 int nodenum, edgenum, source; 16 17 void in(){ 18 cin >> nodenum >> edgenum >> source; 19 for(int i = 1; i <= nodenum ; ++i) 20 dist[i] = maxint ; 21 dist[source] = 0 ; 22 for(int i = 1; i <= edgenum ; ++i){ 23 cin >> edge[i].u >> edge[i].v >> edge[i].weight ; 24 if(edge[i].u == source) 25 dist[edge[i].v] = edge[i].weight ; 26 } 27 } 28 29 void relax(int u,int v,int weight){ 30 if(dist[v] >= dist[u] + weight) 31 dist[v] = dist[u] + weight; 32 } 33 34 35 bool Bellman_Ford(){ 36 for(int i = 1;i <= nodenum-1 ;i++) 37 for(int i = 1;i <= edgenum ;i++){ 38 relax(edge[i].u ,edge[i].v ,edge[i].weight); 39 } 40 /*判断是否存在负环路*/ 41 bool flag=1; 42 for(int i = 1;i <= edgenum ; i++) 43 if(dist[edge[i].v] > dist[edge[i].u] + edge[i].weight ){ 44 flag=0; 45 break; 46 } 47 return flag; 48 } 49 50 int main(){ 51 in(); 52 if(Bellman_Ford){ 53 for(int i = 1; i <= nodenum ;i++) 54 cout << dist[i] <<endl; 55 } 56 return 0; 57 }