bellman_ford算法

给定一个源点,求最短路径,那么存在以源点为根的最短路径树
因为最短路径具有最优子结构的性质,所以我们可以先求出树的第一层,然后再求出树的第二层,以此类推
bellman_ford算法就是按照这种思想求最短路径的。
因为树最多有n-1层,所以只要n-1次循环即可,每次循环i访问所有的边,然后松弛路径,就求出了第i层的最短路径。
那么很明显,该算法的时间复杂度为O(VE)

http://acm.fafu.edu.cn/problem.php?id=1473

 1 #include <stdio.h>
 2 #include <string.h>
 3 const int N = 2000+10;
 4 const int INF = 1<<30;
 5 struct Edge
 6 {
 7     int u,v,weight;
 8 }g[4000000];
 9 int dist[N];
10 void relax(int u, int v,int weight)
11 {
12     if(dist[v] > dist[u] + weight)
13         dist[v] = dist[u] + weight;
14 }
15 void bellman_ford(int n, int m)
16 {
17     int i,j;
18     for(i=0; i<n-1; ++i)//n-1循环
19         for(j=0; j<m; ++j)//枚举所有的边去松弛最短路径
20         {
21             relax(g[j].u,g[j].v,g[j].weight);
22         }    
23 }
24 int main()
25 {
26     int n,m,a,b,c,i;
27     while(scanf("%d%d",&n,&m)!=EOF)
28     {
29         for(i=1; i<=n; ++i)
30             dist[i] = INF;
31         for(i=0; i<m; ++i)
32         {
33             scanf("%d%d%d",&g[i].u,&g[i].v,&g[i].weight);
34             if(g[i].u==1)
35                 dist[g[i].v] = g[i].weight;
36         }        
37         bellman_ford(n,m);
38         for(i=2; i<=n; ++i)
39             printf("%d
",dist[i]);
40     }        
41     return 0;
42 }
原文地址:https://www.cnblogs.com/justPassBy/p/4116525.html