CSU 1307
1307: City Tour
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 549 Solved: 124
[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
HINT
Source
我只看出最短路
怎么让火车的相邻两站间的最大距离尽可能的短?
二分
1 #include <stdio.h> 2 #include <queue> 3 #include <iostream> 4 using namespace std; 5 const int maxn = 2010; 6 const int maxm = 50010; 7 const int maxd = 500000000; 8 int v[maxm],w[maxm],next[maxm],d[maxn],inq[maxn],first[maxn],e; 9 void init() 10 { 11 for(int i =0;i<maxn;i++) 12 { 13 first[i]=-1; 14 } 15 e=0; 16 } 17 18 void addeage(int x,int y,int z) 19 { 20 v[e]=y;w[e]=z;next[e]=first[x]; 21 first[x]=e++; 22 } 23 24 int spfa(int s,int end,int mid) 25 { 26 queue<int> q; 27 for(int i=0;i<maxn;i++) 28 { 29 d[i]=maxd; 30 } 31 d[s]=0;inq[s]=1;q.push(s); 32 while(!q.empty()) 33 { 34 int u = q.front();q.pop();inq[u]=0; 35 for(int i = first[u];i!=-1;i=next[i]) 36 { 37 if(d[v[i]]>d[u]+w[i]&&w[i] <= mid) 38 { 39 d[v[i]]=d[u]+w[i]; 40 if(inq[v[i]]==0) 41 { 42 q.push(v[i]); 43 inq[v[i]]=1; 44 } 45 } 46 } 47 } 48 return d[end]; 49 } 50 int main() 51 { 52 53 int n,m,a,b; 54 while(scanf("%d%d%d%d",&n,&m,&a,&b)!=EOF) 55 { 56 init(); 57 int u,v,w; 58 int l = maxd; 59 int r = -1; 60 int ans = maxd; 61 while(m--) 62 { 63 scanf("%d%d%d",&u,&v,&w); 64 addeage(u,v,w); 65 addeage(v,u,w); 66 l = min(l,w); 67 r = max(r,w); 68 } 69 while(l <= r) 70 { 71 int mid = (l+r)/2; 72 int tmp = spfa(a,b,mid); 73 if(tmp == maxd) 74 l = mid+1; 75 else 76 r = mid-1,ans = tmp; 77 } 78 printf("%d\n",ans); 79 } 80 return 0; 81 }