C--最短路
Time Limit: 7000MS
Memory Limit: 65536KB
Problem Description
给出一个带权无向图,包含n个点,m条边。求出s,e的最短路。保证最短路存在。
Input
多组输入。
对于每组数据。
第一行输入n,m(1<= n && n<=5*10^5,1 <= m && m <= 2*10^6)。
接下来m行,每行三个整数,u,v,w,表示u,v之间有一条权值为w(w >= 0)的边。
最后输入s,e。
接下来m行,每行三个整数,u,v,w,表示u,v之间有一条权值为w(w >= 0)的边。
最后输入s,e。
Output
对于每组数据输出一个整数代表答案。
Example Input
3 1 1 2 3 1 2
Example Output
3
//Bellman-Ford算法实现 #include<stdio.h> #define inf 0x3f3f3f3f int dist[500006], u[4000006], v[4000006], w[4000006]; int main() { int n, m, i, k, s, e, check, /*flag, */t, x, y, z; while(~scanf("%d%d", &n, &m)) { t = 1; for(i = 1; i <= m; i++)//无向图输入 { scanf("%d%d%d", &x, &y, &z); u[t] = x, v[t] = y, w[t] = z; t++; u[t] = y, v[t] = x, w[t] = z; t++; } scanf("%d%d", &s, &e); for(i = 1; i <= n; i++)//初始化 dist[i] = inf; dist[s] = 0; m = 2 * m;//无向图 Bellman-Ford核心算法 for(k = 0; k < n - 1; k++) { check = 0; for(i = 1; i <= m; i++) { if(dist[v[i]] > dist[u[i]] + w[i]) { dist[v[i]] = dist[u[i]] + w[i]; check = 1; } } if(check == 0) break; } /*flag = 0;//判断负权 本题不需要 for(i = 1; i <= m; i++) { if(dist[v[i]] > dist[u[i]] + w[i])flag = 1; } if(flag)printf("error because of -\n"); else*/ printf("%d\n", dist[e]); } return 0; } /*Bellman-Ford核心算法 + 优化
for(k = 0; k < n - 1; k++) { check = 0; for(i = 1; i <= m; i++) { if(dist[v[i]] > dist[u[i]] + w[i]) { dist[v[i]] = dist[u[i]] + w[i]; check = 1; } } if(check == 0) break; }*/