CSU 1307

1307: City Tour

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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 }

 

posted @ 2014-08-14 21:56  Run_dream  阅读(195)  评论(0编辑  收藏  举报