标签:style blog http io color sp for on div
给定一个源点,求最短路径,那么存在以源点为根的最短路径树
因为最短路径具有最优子结构的性质,所以我们可以先求出树的第一层,然后再求出树的第二层,以此类推
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 }
标签:style blog http io color sp for on div
原文地址:http://www.cnblogs.com/justPassBy/p/4116525.html