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\n",dist[i]);

40     }        

41     return 0;

42 }

 

你可能感兴趣的:(for)