bzoj4326 运输计划
4326: NOIP2015 运输计划
Time Limit: 30 Sec Memory Limit: 128 MB
Description
公元 2044 年,人类进入了宇宙纪元。L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球。小 P 掌管一家物流公司, 该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之间不会产生任何干扰。为了鼓励科技创新, L 国国王同意小 P 的物流公司参与 L 国的航道建设,即允许小P 把某一条航道改造成虫洞,飞船驶过虫洞不消耗时间。在虫洞的建设完成前小 P 的物流公司就预接了 m 个运输计划。在虫洞建设完成后,这 m 个运输计划会同时开始,所有飞船一起出发。当这 m 个运输计划都完成时,小 P 的物流公司的阶段性工作就完成了。如果小 P 可以自由选择将哪一条航道改造成虫洞, 试求出小 P 的物流公司完成阶段性工作所需要的最短时间是多少?
Input
第一行包括两个正整数 n,m,表示 L 国中星球的数量及小 P 公司预接的运输计划的数量,星球从 1 到 n 编号。接下来 n−1 行描述航道的建设情况,其中第 i 行包含三个整数 ai,bi 和 ti,表示第 i 条双向航道修建在 ai 与 bi 两个星球之间,任意飞船驶过它所花费的时间为 ti。数据保证 1≤ai,bi≤n 且 0≤ti≤1000。接下来 m 行描述运输计划的情况,其中第 j 行包含两个正整数 uj 和 vj,表示第 j 个运输计划是从 uj 号星球飞往 vj号星球。数据保证 1≤ui,vi≤n
Output
输出文件只包含一个整数,表示小 P 的物流公司完成阶段性工作所需要的最短时间。
Sample Input
1 2 3
1 6 4
3 1 7
4 3 6
3 5 5
3 6
2 5
4 5
Sample Output
HINT
Tips:
本题还是比较坑的,代码写的弱一点会超时;
此题可以看出是具有二分性质的;
但是二分的判断做到O(n)或O(m)看起来会很难;
由于这是一棵树,我们需要知道两点间的距离可以用tarjan求lca求出距离;
对于每个二分的答案x;
显然<=x的距离是可以不用管它的;
将>=x的距离的边数记下来;
将>=x的距离的边的起点终点加一,lca减2;(差分思想自寻百度,我也讲不清);
dfs一遍,找到 经过边数=记下来的边数 的边,取边权最大值的;
判断最大距离-取边权最大值是否小于等于x即可;
Code:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define MAXN 600008
using namespace std;
int n,m,head[MAXN],next[MAXN],vet[MAXN],len[MAXN],dis[MAXN],ance[MAXN];
int head1[MAXN],next1[MAXN],vet1[MAXN],hh[MAXN],ans[MAXN];
int color[MAXN],fa[MAXN],tot,tot1,l,r,res,ff[MAXN],tmp[MAXN]; int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
} void add1(int x,int y){
tot1++;
hh[tot1]=x;
next1[tot1]=head1[x];
head1[x]=tot1;
vet1[tot1]=y;
} void add(int x,int y,int z){
tot++;
next[tot]=head[x];
head[x]=tot;
vet[tot]=y;
len[tot]=z;
} void tarjan(int u){
color[u]=;
for(int i=head[u];i!=;i=next[i]){
int y=vet[i];
if(!color[y]){
dis[y]=dis[u]+len[i];
tarjan(y);
fa[y]=u;
}
}
for(int i=head1[u];i!=;i=next1[i]){
int y=vet1[i];
if(color[y]){
ance[(i+)/]=find(y);
ans[(i+)/]=dis[u]+dis[y]-*dis[ance[(i+)/]];
r=max(ans[(i+)/],r);
}
}
} void dfs(int u){
color[u]=;
for(int i=head[u];i!=;i=next[i]){
int y=vet[i];
if(!color[y]){
ff[y]=len[i];
dfs(y);
tmp[u]+=tmp[y];
}
}
} bool check(int flag){
int ma=,sum=,g=;
memset(color,,sizeof(color));
memset(tmp,,sizeof(tmp));
for(int i=;i<=m;i++){
if(ans[i]>flag){
tmp[hh[i*]]++;
tmp[vet1[i*]]++;
tmp[ance[i]]-=;
ma=max(ans[i],ma);
sum++;
}
}
dfs();
for(int i=;i<=n;i++){
if(tmp[i]==sum){
g=max(g,ff[i]);
}
}
return (ma-g)<=flag;
} void init(){
tot=tot1=; r=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
fa[i]=i;
}
for(int i=;i<n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
for(int i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
add1(x,y);
add1(y,x);
}
} void solve(){
tarjan();
l=; res=r;
while(l<=r){
int mid=(l+r) >> ;
if(check(mid)){
res=mid;
r=mid-;
}else{
l=mid+;
}
}
} void print(){
printf("%d",res);
} int main(){
init();
solve();
print();
}
bzoj4326 运输计划的更多相关文章
- [CODEVS4632][BZOJ4326]运输计划
题目描述 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P ...
- NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告
前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...
- [BZOJ4326][codevs4632][codevs5440][UOJ#150][NOIP2015]运输计划
[BZOJ4326][codevs4632][codevs5440][UOJ#150][NOIP2015]运输计划 试题描述 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n− ...
- 【bzoj4326】[NOIP2015]运输计划
题目描述 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P 掌管一家物流公司, 该 ...
- NOIP2015 运输计划(bzoj4326)
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 886 Solved: 574[Submit][Status] ...
- [bzoj4326][NOIP2015]运输计划
Description 公元2044年,人类进入了宇宙纪元. 国有个星球,还有条双向航道,每条航道建立在两个星球之间,这条航道连通了国的所有星球. 小掌管一家物流公司,该公司有很多个运输计划,每个运输 ...
- 【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 703 Solved: 461[Submit][Status] ...
- BZOJ4326或洛谷2680 运输计划
BZOJ原题链接 洛谷原题链接 用\(LCA\)初始化出所有运输计划的原始时间,因为答案有单调性,所以二分答案,然后考虑检验答案. 很容易想到将所有超出当前二分的答案的运输计划所经过的路径标记,在这些 ...
- 【bzoj4326】[NOIP2015]运输计划 二分答案+LCA
题目描述 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P 掌管一家物流公司, 该 ...
随机推荐
- nautilus出现一闪而过现象
linux相关问题: 1.这几天在使用乌班图时,出现文件夹打开一闪而过现象,于是我试着使用命令行来启动: sudo nautilus 出现下面这一堆错误(error_info): (nautilus: ...
- HDU 1000 A + B Problem(指针版)
A + B Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- [bzoj1692] [Usaco2007 Dec]队列变换 (hash||暴力)
本题同bzoj1640...双倍经验双倍幸福 虽然数据范围n=3w然而O(n²)毫无压力= = http://blog.csdn.net/xueyifan1993/article/details/77 ...
- python笔记二(mysql数据库操作)
python2.x使用MySQLdb python3.x使用pymysql代替MySQLdb 不过我使用的是python3.5,MySQLdb还是可以在python3.5使用的. #!/usr/bin ...
- Coins、Tokens、山寨币:区别在哪里
[译] Coins, Tokens & Altcoins: What's the Difference? coin:指"正宗的"数字货币,比如比特币 tokens:比如用 ...
- .NET MongoDB Driver GridFS 2.2原理及使用示例
一.API解读 1 GridFSBucketOptions 1)public string BucketName { get; set; } 获取或设置bucket名称 2)public int Ch ...
- Win7如何解决telnet不是内部或外部命令的方案!听语音
Telnet用于远程操作互联网中的设备或终端计算机服务器,可以有效的减少现场操作的麻烦.因为设备或终端是遍布整个省或市,有的甚至是国外,如何高效的处理问题是当务之急,除了telnet还可以ssh使用c ...
- java垃圾回收的分类
1.线程数 分为串行垃圾回收器和并行垃圾回收器.串行垃圾回收器一次只使用一个线程进行垃圾回收:并行垃圾回收器一次将开启多个线程同时进行垃圾回收.在并行能力较强的 CPU 上,使用并行垃圾回收器可以缩短 ...
- Linux的软件安装(JDK安装,Mysql安装,Tomcat安装)
1.JDK安装 注意:rpm与软件相关命令 相当于window下的软件助手 管理软件 步骤: 1)查看当前Linux系统是否已经安装java 输入 rpm -qa | grep java ps:博主这 ...
- action之间传参为中文;type='redirect'和 type='redirectAction'主要区别
摘录自:http://blog.csdn.net/lhi705/article/details/7446156 Struts2中action之间传参中文乱码的问题 解决方法一(已经验证,可以): 两个 ...