libreoj #119. 最短路
题目描述
给一个 n(1≤2500≤n) n(1 \leq 2500 \leq n) n(1≤2500≤n) 个点 m(1≤6200≤m) m(1 \leq 6200 \leq m) m(1≤6200≤m) 条边的无向图,求 s s s 到 t t t 的最短路。
输入格式
第一行四个由空格隔开的整数 n n n、m m m、s s s、t t t。
之后的 m m m 行,每行三个正整数 si s_i si、ti t_i ti、wi(1≤wi≤109) w_i(1 \leq w_i \leq 10 ^ 9) wi(1≤wi≤109),表示一条从 si s_i si 到 ti t_i ti 长度为 wi w_i wi 的边。
输出格式
一个整数表示从 s s s 到 t t t 的最短路长度。数据保证至少存在一条道路。
样例
样例输入
7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1
样例输出
7
#include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<cstring> #define ll long long using namespace std;//2500≤n) 个点 m(1≤6200≤m) m(1 \leq 6200 \leq m) m(1≤6200≤m) const int B=62100; const int D=25100; const ll Maxn=99999999; int head[B]; int now=1; ll dis[D]; bool vis[D]; struct node{ ll u,v,w,nxt; }E[B]; queue<int>q; ll n,m,start,endd; inline ll read() { ll x=0;char c=getchar();ll f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); return x*f; } inline void add(int u,int v,int w) { E[now].u=u; E[now].v=v; E[now].w=w; E[now].nxt=head[u]; head[u]=now++; } inline void spfa(int start) { for(int i=1;i<=n;i++) dis[i]=Maxn; dis[start]=0; vis[start]=1; q.push(start); while(!q.empty()) { int top=q.front(); q.pop(); vis[top]=0; for(int i=head[top];i!=-1;i=E[i].nxt) if(dis[E[i].v]>dis[top]+E[i].w) { dis[E[i].v]=dis[top]+E[i].w; if(!vis[E[i].v]) { vis[E[i].v]=1; q.push(E[i].v); } } } printf("%lld",dis[endd]); } int main() { //freopen("3.in","r",stdin); //freopen("3.out","w",stdout); n=read(); m=read(); start=read(); endd=read(); for(int i=1;i<=n;i++) head[i]=-1; for(int i=1;i<=m;i++) { int u=read(); int v=read(); int w=read(); add(u,v,w); add(v,u,w); } spfa(start); return 0; }