hihocoder#1093 : 最短路径·三:SPFA算法
2017-10-08 12:00
411 查看
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋!
鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路。
不过这个鬼屋虽然很大,但是其中的道路并不算多,所以小Hi还是希望能够知道从入口到出口的最短距离是多少?
提示:Super Programming Festival Algorithm。
每个测试点(输入文件)有且仅有一组测试数据。
在一组测试数据中:
第1行为4个整数N、M、S、T,分别表示鬼屋中地点的个数和道路的条数,入口(也是一个地点)的编号,出口(同样也是一个地点)的编号。
接下来的M行,每行描述一条道路:其中的第i行为三个整数u_i, v_i, length_i,表明在编号为u_i的地点和编号为v_i的地点之间有一条长度为length_i的道路。
对于100%的数据,满足N<=10^5,M<=10^6, 1 <= length_i <= 10^3, 1 <= S, T <= N, 且S不等于T。
对于100%的数据,满足小Hi和小Ho总是有办法从入口通过地图上标注出来的道路到达出口。
对于每组测试数据,输出一个整数Ans,表示那么小Hi和小Ho为了走出鬼屋至少要走的路程。
样例输入
样例输出
单点时限:1000ms
内存限制:256MB
描述
万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋!鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路。
不过这个鬼屋虽然很大,但是其中的道路并不算多,所以小Hi还是希望能够知道从入口到出口的最短距离是多少?
提示:Super Programming Festival Algorithm。
输入
每个测试点(输入文件)有且仅有一组测试数据。在一组测试数据中:
第1行为4个整数N、M、S、T,分别表示鬼屋中地点的个数和道路的条数,入口(也是一个地点)的编号,出口(同样也是一个地点)的编号。
接下来的M行,每行描述一条道路:其中的第i行为三个整数u_i, v_i, length_i,表明在编号为u_i的地点和编号为v_i的地点之间有一条长度为length_i的道路。
对于100%的数据,满足N<=10^5,M<=10^6, 1 <= length_i <= 10^3, 1 <= S, T <= N, 且S不等于T。
对于100%的数据,满足小Hi和小Ho总是有办法从入口通过地图上标注出来的道路到达出口。
输出
对于每组测试数据,输出一个整数Ans,表示那么小Hi和小Ho为了走出鬼屋至少要走的路程。样例输入
5 10 3 5 1 2 997 2 3 505 3 4 118 4 5 54 3 5 480 3 4 796 5 2 794 2 4000 5 146 5 4 604 2 5 63
样例输出
172
#include<bits/stdc++.h> using namespace std; const int MAX=2e6; const int INF=1e9+7; struct lenka { int s,ds; int operator<(const lenka& x)const{return x.ds<ds;} }; struct EDG { int to,next,val; }ed[MAX]; int head[MAX],v[MAX],tot=0; int n,d[MAX]; void add(int x,int y,int z) { ed[tot].to=y; ed[tot].val=z; ed[tot].next=head[x]; head[x]=tot++; } void spfa(int s) { memset(v,0,sizeof v); for(int i=1;i<=n;i++)d[i]=INF; d[s]=0; priority_queue<lenka>p; p.push((lenka){s,0}); while(!p.empty()) { lenka now=p.top();p.pop(); if(v[now.s])continue; v[now.s]=1; for(int i=head[now.s];i!=-1;i=ed[i].next) { int nex=ed[i].to; if(d[nex]>now.ds+ed[i].val) { d[nex]=now.ds+ed[i].val; p.push((lenka){nex,d[nex]}); } } } } int main() { int m,s,t; memset(head,-1,sizeof head); scanf("%d%d%d%d",&n,&m,&s,&t); while(m--) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } spfa(s); printf("%d\n",d[t]); return 0; }
相关文章推荐
- 最短路径·三:SPFA算法 HihoCoder - 1093 (spfa无向图)
- hihoCoder - 1093 - 最短路径·三:SPFA算法 (SPFA)
- hihoCoder 1093 最短路径·三:SPFA算法
- hihocoder #1093 : 最短路径·三:SPFA算法
- #1093 : 最短路径·三:SPFA算法 hihocoder SPFA
- hihoCoder - 1093 - 最短路径·三:SPFA算法
- hihoCoder 1093 : 最短路径·三:SPFA算法
- # hihocoder #1093 : 最短路径·三:SPFA算法
- [hihoCoder] #1093 : 最短路径·三:SPFA算法
- hihoCoder 1093 : 最短路径·三:SPFA算法
- HIHO #1093 : 最短路径·三:SPFA算法
- hihocoder 1093 : 最短路径·三:SPFA算法
- 最短路径问题的Dijkstra和SPFA算法总结
- SPFA算法与dijkstra算法求单源最短路径的比较
- 最短路径算法之四——SPFA算法
- hiho刷题日记——第二十五天最短路径·三:SPFA算法
- SPFA算法求最短路径(解决负边权问题)
- 可以处理负权的单源最短路径的SPFA算法带图详解(自己画的图)
- spfa算法——最短路径算法
- 最短路径 之 SPFA算法