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 }

 

posted @ 2017-03-26 21:01  JRicardo丶  阅读(179)  评论(0编辑  收藏  举报