首页 > 代码库 > libreoj #119. 最短路
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 s?i??、ti t_i t?i??、wi(1≤wi≤109) w_i(1 \leq w_i \leq 10 ^ 9) w?i??(1≤w?i??≤10?9??),表示一条从 si s_i s?i?? 到 ti t_i t?i?? 长度为 wi w_i w?i?? 的边。
输出格式
一个整数表示从 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; }
libreoj #119. 最短路
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。