Bellman算法模板

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 const int inf=1<<29;
 6 const int N=1001;
 7 int w[N][N],d[N];
 8 int u,v,c,m,n,k;
 9 struct node
10 {
11     int from;
12     int to;
13     int c;
14 }e[N*N];
15 bool Bellman_ford(int st)
16 {
17     for(int i=1;i<=n;i++)
18     {
19         d[i]=inf;
20     }
21     d[st]=0;
22     for(int i=1;i<n;i++)
23     {
24        for(int j=0;j<=2*m;j++)
25        {
26            if(d[e[j].to]>d[e[j].from]+e[j].c)
27            {
28                d[e[j].to]=d[e[j].from]+e[j].c;
29             //更新的是该点到起点的距离d[*],则其他通过(该点)的点回到起点的距离也有可能会被更新
30             //所以要循环n-1次,保证所有边都能够更新完,(若每次循环都只更新一条边,就会更新n-1次);   
31            }//与dij比较,更新后没有标记,可以持续更新;
32 
33        }
34     }
35     for(int i=0;i<2*m;i++)//如果持续更新,则存在负权环,抛出错误(如果是无向图,回路中只要存在一个负值,就会形成负权环)
36         if(d[e[i].to]>d[e[i].from]+e[i].c)
37         return true;
38     return false;
39 }
40 int main()
41 {
42     while(scanf("%d%d",&n,&m)!=EOF)
43     {
44         for(int i=0;i<2*m;i+=2)//人为付成无向图
45         {
46            scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].c);
47            e[i+1].from=e[i].to;
48            e[i+1].to=e[i].from;
49            e[i+1].c=e[i].c;
50         }
51         scanf("%d",&k);
52         if(Bellman_ford(k))
53             printf("-1
");
54         else
55         {
56             for(int i=2;i<=n;i++)
57                 printf("%d %d
",i,d[i]);
58         }
59     }
60     return 0;
61 }
原文地址:https://www.cnblogs.com/tianmin123/p/4775022.html