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 掌管一家物流公司, 该 ...
随机推荐
- 关于在selenium 中 webdriver 截图操作
package prictce; import java.io.File; import java.io.IOException; import org.junit.After; import org ...
- 强化学习 - Q-learning Sarsa 和 DQN 的理解
本文用于基本入门理解. 强化学习的基本理论 : R, S, A 这些就不说了. 先设想两个场景: 一. 1个 5x5 的 格子图, 里面有一个目标点, 2个死亡点二. 一个迷宫, 一个出发点, ...
- js分享功能
引用JiaThis的分享功能: 直接在想要放置分享功能的地方加上如下代码即可: <!-- JiaThis Button BEGIN --> <div class="jiat ...
- 【批处理学习笔记】第十二课:常用DOS命令(2)
文件管理type 显示文本文件的内容.copy 将一份或多份文件复制到另一个位置.del 删除一个或数个文件.move 移动文件并重命名文件和目录.(Windows XP Home Edition中没 ...
- 51nod:1689 逛街
原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1689 一开始想枚举逛街的终点,然后开两个大根堆维护b值,分别 ...
- bzoj 3874: [Ahoi2014]宅男计划
Description [故事背景] 自从迷上了拼图,JYY就变成了个彻底的宅男.为了解决温饱问题,JYY 不得不依靠叫外卖来维持生计. [问题描述] 外卖店一共有N种食物,分别有1到N编号.第i种 ...
- flume1.8 Channel类型介绍(四)
1. Flume Channel Channels是events在agent上进行的存储库.Source添加events,Sink移除events. 1.1 Memory Channel(内存Chan ...
- redis3.0 集群在windows上的配置(转)
1. 安装Redis版本:win-3.0.501https://github.com/MSOpenTech/redis/releases页面有,我下载的是zip版本的:Redis-x64-3.0.50 ...
- vue2.0项目中使用Ueditor富文本编辑器示例
最近在vue项目中需要使用富文本编辑器,于是将Ueditor集成进来,作为公共组件. 在线预览:https://suweiteng.github.io/vue2-management-platform ...
- 邓_ecshop
=========================================== 版本错误: error_reporting(0); ============================== ...