洛谷 P2680 运输计划
题目背景
公元 2044 年,人类进入了宇宙纪元。
题目描述
L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球。
小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物
流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道 是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之 间不会产生任何干扰。
为了鼓励科技创新,L 国国王同意小 P 的物流公司参与 L 国的航道建设,即允许小 P 把某一条航道改造成虫洞,飞船驶过虫洞不消耗时间。
在虫洞的建设完成前小 P 的物流公司就预接了 m 个运输计划。在虫洞建设完成后, 这 m 个运输计划会同时开始,所有飞船一起出发。当这 m 个运输计划都完成时,小 P 的 物流公司的阶段性工作就完成了。
如果小 P 可以自由选择将哪一条航道改造成虫洞,试求出小 P 的物流公司完成阶段 性工作所需要的最短时间是多少?
输入输出格式
输入格式:
输入文件名为 transport.in。
第一行包括两个正整数 n、m,表示 L 国中星球的数量及小 P 公司预接的运输计划的数量,星球从 1 到 n 编号。
接下来 n-1 行描述航道的建设情况,其中第 i 行包含三个整数 ai, bi 和 ti,表示第
i 条双向航道修建在 ai 与 bi 两个星球之间,任意飞船驶过它所花费的时间为 ti。
接下来 m 行描述运输计划的情况,其中第 j 行包含两个正整数 uj 和 vj,表示第 j个 运输计划是从 uj 号星球飞往 vj 号星球。
输出格式:
输出 共1行,包含1个整数,表示小P的物流公司完成阶段性工作所需要的最短时间。
输入输出样例
6 3
1 2 3
1 6 4
3 1 7
4 3 6
3 5 5
3 6
2 5
4 5
11
说明
所有测试数据的范围和特点如下表所示

请注意常数因子带来的程序效率上的影响。
三模wzx大佬
解法见此大佬博客
orz wzx
orz wzx
orz wzx
#include <ctype.h>
#include <cstring>
#include <cstdio>
#define M 300005 void read(int &x)
{
x=;bool f=;
register char ch=getchar();
for(; !isdigit(ch); ch=getchar()) if(ch=='-') f=;
for(; isdigit(ch); ch=getchar()) x=(x<<)+(x<<)+ch-'';
x=f?(~x)+:x;
}
int Mcost,dis[M],cost[M],n,m,top[M],cnt,pos[M],head[M],tim,siz[M],fa[M],dep[M];
struct Edge
{
int next,to,dis;
Edge (int next=,int to=,int dis=) : next(next),to(to),dis(dis) {}
}edge[M<<];
struct P
{
int u,v,lca,cost;
P (int u=,int v=,int lca=,int cost=) : u(u),v(v),lca(lca),cost(cost) {}
}p[M<<];
void ins(int u,int v,int w)
{
edge[++cnt]=Edge(head[u],v,w);
head[u]=cnt;
}
void dfs1(int x)
{
dep[x]=dep[fa[x]]+;
siz[x]=;
for(int u=head[x];u;u=edge[u].next)
{
int v=edge[u].to;
if(fa[x]!=v)
{
dis[v]=dis[x]+edge[u].dis;
fa[v]=x;
dfs1(v);
siz[x]+=siz[v];
}
}
}
void dfs2(int x)
{
if(!top[x]) top[x]=x;
pos[x]=++tim;
int p=;
for(int u=head[x];u;u=edge[u].next)
{
int v=edge[u].to ;
if(fa[x]!=v&&siz[v]>siz[p]) p=v;
}
if(p) {top[p]=top[x];dfs2(p);}
for(int u=head[x];u;u=edge[u].next)
{
int v=edge[u].to;
if(fa[x]!=v&&v!=p) dfs2(v);
}
}
void swap(int &x,int &y)
{
int tmp=y;
y=x;
x=tmp;
}
int getlca(int x,int y)
{
for(;top[x]!=top[y];x=fa[top[x]])
if(dep[top[x]]<dep[top[y]]) swap(x,y);
return dep[x]<dep[y]?x:y;
}
int max(int a,int b) {return a>b?a:b;}
void dfs3(int x)
{
for(int u=head[x];u;u=edge[u].next)
{
int v=edge[u].to;
if(fa[x]!=v)
{
dfs3(v);
cost[x]+=cost[v];
}
}
}
bool check(int k)
{
memset(cost,,sizeof(cost));
int num=;
for(int i=;i<=m;i++)
{
if(p[i].cost>k)
{
num++;
cost[p[i].u]++;
cost[p[i].v]++;
cost[p[i].lca]-=;
}
}
dfs3();
for(int i=;i<=n;i++) if(cost[i]==num&&dis[i]-dis[fa[i]]>=Mcost-k) return true;
return false;
}
int main()
{
read(n);
read(m);
for(int x,y,z,i=;i<n;i++)
{
read(x);
read(y);
read(z);
ins(x,y,z);
ins(y,x,z);
}
dfs1();dfs2();
for(int x,y,i=;i<=m;i++)
{
read(x);read(y);
int Lca=getlca(x,y);
int cos=dis[x]+dis[y]-dis[Lca]*;
p[i]=P(x,y,Lca,cos);
Mcost=max(Mcost,cos);
}
int ans,l=,r=Mcost+;
for(;l<=r;)
{
int mid=(l+r)>>;
if(check(mid))
{
r=mid-;
ans=mid;
}
else l=mid+;
}
printf("%d\n",ans);
return ;
}
洛谷 P2680 运输计划的更多相关文章
- 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)
P2680 运输计划 题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条 ...
- 洛谷 P2680 运输计划 解题报告
P2680 运输计划 题目背景 公元2044年,人类进入了宇宙纪元. 题目描述 公元2044年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道,每条航道建立在两个星 ...
- [NOIP2015] 提高组 洛谷P2680 运输计划
题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...
- 洛谷P2680 运输计划 [LCA,树上差分,二分答案]
题目传送门 运输计划 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n?1 条双向航道,每条航道建立在两个星球之间, 这 n?1 条航道连通了 L 国的所 ...
- 洛谷 P2680 运输计划(NOIP2015提高组)(BZOJ4326)
题目背景 公元 \(2044\) 年,人类进入了宇宙纪元. 题目描述 公元\(2044\) 年,人类进入了宇宙纪元. L 国有 \(n\) 个星球,还有 \(n-1\) 条双向航道,每条航道建立在两个 ...
- 洛谷——P2680 运输计划
https://www.luogu.org/problem/show?pid=2680 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每 ...
- 洛谷P2680 运输计划——树上差分
题目:https://www.luogu.org/problemnew/show/P2680 久违地1A了好高兴啊! 首先,要最大值最小,很容易想到二分: 判断当前的 mid 是否可行,需要看看有没有 ...
- 洛谷P2680 运输计划
大概就是二分+树上差分... 题意:给你树上m条路径,你要把一条边权变为0,使最长的路径最短. 最大的最小,看出二分(事实上我并没有看出来...) 然后二分k,对于所有大于k的边,树上差分求出最长公共 ...
- 洛谷P2680运输计划
传送门啦 要求的就是,把树上的一条边的权值设为0之后,所有路径中的最大值的最小值. 首先二分最大值,假设某次二分的最大值为x,我们首先找出所有大于x的路径(也就是我们需要通过改权缩短的路径),并把路径 ...
随机推荐
- 出现Insufficient space for shared memory file错误解决
今天在linux下敲命令,出现上面的错误,原来是临时文件目录(/tmp)下的空间不够了,df一看/下100%了.
- ubuntu中使用apt-get安装zbar
apt-get是linux中常用的shell命令,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索.安装.升级.卸载软件或操作系统.apt-get命令一般需要root权限执行,所以 ...
- CodeBlocks+Qt(MinGW)配置
1.安装CodeBlocks 官网:http://www.codeblocks.org/ 下载地址:http://www.codeblocks.org/downloads/26 有以下两种选择 cod ...
- bzoj2839
容斥原理+组合数学 看见这种恰有k个的题一般都是容斥原理,因为恰有的限制比较强,一般需要复杂度较高的方法枚举,而容斥就是转化为至少有k个,然后通过容斥原理解决 我们先选出k个元素作为交集,有C(n,k ...
- 关于 android 中 postDelayed方法的讲解 (转载)
转自:http://blog.csdn.net/xiabo851205/article/details/7991529 这是一种可以创建多线程消息的函数 使用方法: 1,首先创建一个Handler对象 ...
- 51nod 1103【鸽巢原理】
思路: 这道题嘛有些弯还是要转的,比如你说让你搞n的倍数,你别老老实实照她的意思去啊,倍数可以除法,取膜 . 因为n个数我们可以求前缀和然后取膜,对n取膜的话有0-n-1种情况,所以方案一定是有的,说 ...
- 洛谷P3825 [NOI2017]游戏(2-SAT)
传送门 果然图论的题永远建图最麻烦……看着题解代码的建图过程真的很珂怕…… 先不考虑地图$x$,那么每一个地图都只能用两种赛车,于是我们可以用2-SAT来搞,用$i$表示这个地图能用的第一辆车,$i' ...
- 【EXCEL终极总结分享】基于NPOI扩展封装的简易操作工具类库(简单灵活易用,支持导出、导入、上传等常见操作)
对于EXCEL的导入.导出,我之前已分享过多次,比如: 第一种方案:<我写的一个ExcelHelper通用类,可用于读取或生成数据>这个主要是利用把EXCEL当成一个DB来进行获取数据,导 ...
- TensorFlow图像处理函数
参考书 <TensorFlow:实战Google深度学习框架>(第2版) 图像编码处理+图像大小调整+图像翻转+图像色彩调整+处理标注框 #!/usr/bin/env python # - ...
- class JsonItemExporter(BaseItemExporter):
class JsonItemExporter(BaseItemExporter):这个类的实现和几年前的实现有了点小变化,主要就是是否添加换行