1307: City Tour
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 392 Solved: 68
[ Submit][ Status][ Web Board]
Description
Alice想要从城市A出发到城市B,由于Alice最近比较穷(不像集训队陈兴老师是个rich second),所以只能选择做火车从A到B。不过Alice很讨厌坐火车,火车上人比较多,比较拥挤,所以Alice有很严格的要求:火车的相邻两站间的最大距离尽可能的短,这样Alice就可以在停站的时候下车休息一下。当然Alice希望整个旅途比较短。
Input
有多组测试数据。
每组测试数据的第一行有两个整数N,M,A,B(N<=2000, M<=50000, N >=2, A,B<=N),其中N是城市的个数,M是城市间通火车的个数。
A,B是Alice起始的城市与目的地城市,城市的标号从1开始。
接下来的M行每行三个整数u,v,w表示从u到v和从v到u有一条铁路,距离为w, u,v<=N, w<=10000。
Output
对于每组测试数据输出满足Alice要求的从A到B的最短距离。
Sample Input
3 3 1 2 1 2 80 1 3 40 2 3 50 3 3 1 2 1 2 90 1 3 10 2 3 20 4 5 1 4 1 2 8 1 4 9 1 3 10 2 4 7 3 4 8
Sample Output
90 30 15
#include<iostream> #include<cmath> #include<queue> #include<cstdio> #include<cstring> #include<algorithm> #define INF 100000000 using namespace std; const int MAXN=2005; const int MAXM=50010; int maxm,n; int head[MAXN],vis[MAXN],dis[MAXN]; struct Seg { int v,w,next; }Edge[MAXM]; void addEdge(int u,int v,int w) { Edge[maxm].v=v; Edge[maxm].w=w; Edge[maxm].next=head[u]; head[u]=maxm++; } int spfa(int a,int b,int k) { queue<int>Q; Q.push(a); for(int i=0;i<=n;dis[i++]=INF); memset(vis,0,sizeof(vis)); dis[a]=0; while(!Q.empty()) { int u=Q.front(); Q.pop(); vis[u]=0; for(int i=head[u];i!=-1;i=Edge[i].next) { if(Edge[i].w<=k) { if(dis[Edge[i].v]>dis[u]+Edge[i].w) { dis[Edge[i].v]=dis[u]+Edge[i].w; if(!vis[Edge[i].v]) { vis[Edge[i].v]=1; Q.push(Edge[i].v); } } } } } return dis[b]==INF?0:dis[b]; } int main() { int m,a,b; while(scanf("%d%d%d%d",&n,&m,&a,&b)!=EOF) { int u,v,w; memset(head,-1,sizeof(head)); maxm=0; while(m--) { scanf("%d%d%d",&u,&v,&w); addEdge(u,v,w); addEdge(v,u,w); } // for(int i=head[1];i!=-1;i=Edge[i].next)printf("1 %d %d\n",Edge[i].v,Edge[i].w); int l=0,r=10001,mid; while(1+l<r) { mid=(l+r)>>1; if(spfa(a,b,mid)) r=mid; else l=mid; // printf("%d %d\n",mid,dis[b]); } printf("%d\n",spfa(a,b,r)); } return 0; }