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 }

CSU 1307,布布扣,bubuko.com

时间: 2024-12-28 04:24:50

CSU 1307的相关文章

CSU 1307 最短路+二分

题目大意: 帮忙找到一条a到b的最短路,前提是要保证路上经过的站点的最大距离尽可能短 这道题居然要用到二分...完全没去想过,现在想想求最大距离的最小值确实是... 这里不断二分出值代入spfa()或者dijkstla()中计算a到b的最短距离,每次都保证只经过边小于mid值的路径 1 #include <iostream> 2 #include <cstdio> 3 #include <queue> 4 #include <cstring> 5 #incl

CSU-ACM2014年校队选拔赛指导赛解题报告

•Problem A  CSU 1065                               贪心 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 const int maxn = 1000010; 6 struct Node{ 7 int a,b; 8 bool operator < (const Node& rhs)

CSU 1804: 有向无环图(拓扑排序)

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 题意:…… 思路:对于某条路径,在遍历到某个点的时候,之前遍历过的点都可以到达它,因此在这个时候对答案的贡献就是∑(a1 + a2 + a3 + ... + ai) * bv,其中a是之前遍历到的点,v是当前遍历的点. 这样想之后就很简单了.类似于前缀和,每次遍历到一个v点,就把a[u]加给a[v],然后像平时的拓扑排序做就行了. 1 #include <bits/stdc++.h>

CSU 1111: 三家人【有趣的思维题】

1111: 三家人 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 2241  Solved: 874 [Submit][Status][Web Board] Description 有三户人家共拥有一座花园,每户人家的太太均需帮忙整理花园.A 太太工作了5 天,B 太太则工作了4 天,才将花园整理完毕.C 太太因为正身怀六甲无法加入她们的行列,便出了90元.请问这笔钱如何分给A.B 二位太太较为恰当?A 应得多少元?90/(5+4)*5=$50

CSU 1112: 机器人的指令【模拟题】

1112: 机器人的指令 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1858  Solved: 682 [Submit][Status][Web Board] Description 数轴原点有一个机器人.该机器人将执行一系列指令,你的任务是预测所有指令执行完毕之后它的位置. ·LEFT:往左移动一个单位 ·RIGHT: 往右移动一个单位 ·SAME AS i: 和第i 条执行相同的动作.输入保证i 是一个正整数,且不超过之前执行指令数 In

CSU 1416 Practical Number

原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1416 结论题,具体判断方法请点击这个网址. 筛素数是肯定的,但一开始定的范围太大了,想当然要筛到10^9的质数,但仔细想想,只要到sqrt(10^9)就可以了,最后的那一个质数是最后一步的比较,不用筛出来. #include <stdio.h> #include <string.h> #include <iostream> using namespace st

CSU 1412 Line and Circles

原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1412 题目要求判断是否有一条直线可以穿过所有的圆. 做法:把所有圆心做一次凸包,然后判断这个凸包是否能通过一个宽度为2*R的通道. 做法和求凸包直径差不多,只是判断的时候把点到两个端点的距离换成点到直线的距离. #include <stdio.h> #include <string.h> #include <math.h> #include <stdli

51nod 1307 绳子与重物(并查集水了一发)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 思路: 可以直接二分答案,然后dfs. 因为标签是并查集,所以我考虑了一下并查集,利用并查集不断向上回溯加负重,居然过了,只能说数据有点水. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #incl

CSU 1547 Rectangle(dp、01背包)

题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1547 Description Now ,there are some rectangles. The area of these rectangles is 1* x or 2 * x ,and now you need find a big enough rectangle( 2 * m) so that you can put all rectangles into it(th