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。Output
对于每组数据输出一个整数代表答案。
Sample Input
3 1 1 2 3 1 2Sample Output
3
#include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f #define Max 500010 int n, m, cnt; int head[Max]; int vis[Max]; int dis[Max]; struct node { int v, w; int next; } q[5000100]; void add(int u, int v, int w) { q[cnt].v = v; q[cnt].w = w; q[cnt].next = head[u]; head[u] = cnt++; } void SPFA(int s, int e) { memset(vis, 0, sizeof(vis)); memset(dis, Max, sizeof(dis)); vis[s] = 1; dis[s] = 0; queue<int> a; a.push(s); while(!a.empty()) { int t = a.front(); a.pop(); vis[t] = 0; for(int i = head[t]; i!=-1; i = q[i].next) { if(dis[q[i].v] > dis[t] + q[i].w) { dis[q[i].v] = dis[t] + q[i].w; if(!vis[q[i].v]) { vis[q[i].v] = 1; a.push(q[i].v); } } } } printf("%d\n", dis[e]); } int main() { int u, v, w, i, s, e; while(~scanf("%d%d", &n, &m)) { cnt = 0; memset(head, -1, sizeof(head)); for(i = 0; i < m; i++) { scanf("%d%d%d", &u, &v, &w); add(u, v, w); add(v, u, w); } scanf("%d%d", &s, &e); SPFA(s, e); } }