题目背景

公元 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的物流公司完成阶段性工作所需要的最短时间。

输入输出样例

输入样例#1:

6 3
1 2 3
1 6 4
3 1 7
4 3 6
3 5 5
3 6
2 5
4 5
输出样例#1:

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 运输计划的更多相关文章

  1. 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)

    P2680 运输计划 题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条 ...

  2. 洛谷 P2680 运输计划 解题报告

    P2680 运输计划 题目背景 公元2044年,人类进入了宇宙纪元. 题目描述 公元2044年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道,每条航道建立在两个星 ...

  3. [NOIP2015] 提高组 洛谷P2680 运输计划

    题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...

  4. 洛谷P2680 运输计划 [LCA,树上差分,二分答案]

    题目传送门 运输计划 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n?1 条双向航道,每条航道建立在两个星球之间, 这 n?1 条航道连通了 L 国的所 ...

  5. 洛谷 P2680 运输计划(NOIP2015提高组)(BZOJ4326)

    题目背景 公元 \(2044\) 年,人类进入了宇宙纪元. 题目描述 公元\(2044\) 年,人类进入了宇宙纪元. L 国有 \(n\) 个星球,还有 \(n-1\) 条双向航道,每条航道建立在两个 ...

  6. 洛谷——P2680 运输计划

    https://www.luogu.org/problem/show?pid=2680 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每 ...

  7. 洛谷P2680 运输计划——树上差分

    题目:https://www.luogu.org/problemnew/show/P2680 久违地1A了好高兴啊! 首先,要最大值最小,很容易想到二分: 判断当前的 mid 是否可行,需要看看有没有 ...

  8. 洛谷P2680 运输计划

    大概就是二分+树上差分... 题意:给你树上m条路径,你要把一条边权变为0,使最长的路径最短. 最大的最小,看出二分(事实上我并没有看出来...) 然后二分k,对于所有大于k的边,树上差分求出最长公共 ...

  9. 洛谷P2680运输计划

    传送门啦 要求的就是,把树上的一条边的权值设为0之后,所有路径中的最大值的最小值. 首先二分最大值,假设某次二分的最大值为x,我们首先找出所有大于x的路径(也就是我们需要通过改权缩短的路径),并把路径 ...

随机推荐

  1. js 购物车中,多件商品数量加减效果修改,实现总价随数量加减改变

    <!DOCTYPE html> <html> <head> <meta charset=UTF-8 /> <title>无标题文档</ ...

  2. VS 一些配置设置

    /************************************************************************ * VS 一些配置设置 * 说明: * 最近要用到C ...

  3. SPOJ:Ada and Orange Tree (LCA+Bitset)

    Ada the Ladybug lives near an orange tree. Instead of reading books, she investigates the oranges. T ...

  4. 一个简单的backbone实例(基于139邮箱)

    先看一下效果图: 代码如下: <!doctype html> <html lang="en"> <head> <meta http-equ ...

  5. CS231n 2016 通关 第二章-KNN 作业分析

    KNN作业要求: 1.掌握KNN算法原理 2.实现具体K值的KNN算法 3.实现对K值的交叉验证 1.KNN原理见上一小节 2.实现KNN 过程分两步: 1.计算测试集与训练集的距离 2.通过比较la ...

  6. Start Developing Mac Apps -- Mac App Store Mac 应用商店

      Mac App Store The information you’ve read so far focused on how to create an app in Xcode. However ...

  7. VMware ESXI虚拟机挂载移动硬盘

    Windows server2008 R2 1.“编辑虚拟机设置”,点击“添加” 2.点击添加“USB控制器”: 3.添加完“USB控制器”以后,再点击添加“USB设备”: 完成即可:如果系统里面不显 ...

  8. iView 实战系列教程(21课时)_1.iView 实战教程之配置篇

    1.iView 实战教程之配置篇 点击添加插件,. 选中后安装 全部导入还是按需导入. 2.是否需要自定义主题变量 3.多语言的设置. 这里我们全部选择为默认 然后点击继续. 启动项目 入口文件导入了 ...

  9. nodejs实现百度实时推送

    想要加快百度收录,肯定免不了链接提交吧,当然链接提交的方式有很多种,今天来说一下百度的实时推送.. 第一次看到这post请求确实有点萌逼,我自己是做前端的对后台接触确实不多,见到的前端发送post请求 ...

  10. LIS LCS LCIS (主要过一遍,重在做题)

    只详细讲解LCS和LCIS,别的不讲-做题优先. 菜鸟能力有限写不了题解,可以留评论,我给你找博客. 先得理解最长上升子序列吧,那个HDOJ拦截导弹系列可以做一下,然后用o(n)log(n)的在做一遍 ...