[P4886] 快递员
考虑在树上选个点rt作为根,并且快递中心就选这儿。计算出所有配送的代价(2*两段之和),设他们的最大值为Max。若此时存在下列情况时,可以判定Max已经为最优解。
1)存在代价为Max的配送(u,v)且uv分别属于rt的不同的两个“儿子的子树”。
2)存在代价为Max的配送(u1,v1)(u2,v2)且u1u2分别属于rt的不同的两个“儿子的子树”。
3)存在代价为Max的配送(u1,v1)(u2,v2)且v1v2分别属于rt的不同的两个“儿子的子树”。
但是若1)不存在,2)、3)不就是一种情况了吗,滑稽。 概括一下就是当所欲代价为Max的配送的端点所属于的“儿子的子树”不唯一,则已达到最优解,证明就上边那三种情况。
如果都不满足的话,那么更优的选点应在Max的配送(u,v)的u(=v)所属于的那个“儿子的子树”里。分治下去就好。
【实现】
int n,m;
int head[N],to[M],len[M],last[M];
int sum,rt,qu[N],qv[N],fiz[N],siz[N],dis[N],bel[N];
bool ban[N];
void addEdge(int x,int y,int w) {
static int cnt=0;
to[++cnt]=y;
len[cnt]=w;
last[cnt]=head[x];
head[x]=cnt;
}
void getRoot(int x,int pa) {
fiz[x]=0,siz[x]=1;
for(int i=head[x]; i; i=last[i]) {
if(to[i]==pa||ban[to[i]]) continue;
getRoot(to[i],x);
siz[x]+=siz[to[i]];
fiz[x]=max(fiz[x],siz[to[i]]);
}
fiz[x]=max(fiz[x],sum-siz[x]);
if(fiz[x]<fiz[rt]) rt=x;
}
void getDis(int x,int pa,int id) {
bel[x]=id;
for(int i=head[x]; i; i=last[i]) {
if(to[i]==pa) continue;
dis[to[i]]=dis[x]+len[i];
getDis(to[i],x,id);
}
}
int sta[N];
int solveAt(int x) {
if(ban[x]) return 2e9;
ban[x]=1,dis[x]=0;
for(int i=head[x]; i; i=last[i]) {
dis[to[i]]=len[i];
getDis(to[i],x,to[i]);
}
int Max=0,top=0;
for(int i=1; i<=m; ++i) {
if(Max<dis[qu[i]]+dis[qv[i]]) {
Max=dis[qu[i]]+dis[qv[i]];
sta[top=1]=i;
} else if(Max==dis[qu[i]]+dis[qv[i]]) {
sta[++top]=i;
}
}
for(int i=1; i<=top; ++i) {
if(bel[qu[sta[i]]]!=bel[qv[sta[i]]]) return Max;
if(bel[qu[sta[i]]]!=bel[qu[sta[1]]]) return Max;
}
rt=0;
sum=siz[bel[qu[sta[1]]]];
getRoot(bel[qu[sta[1]]],x);
return min(Max,solveAt(rt));
}
int main() {
read(n),read(m);
for(int x,y,w,i=n; --i; ) {
read(x),read(y),read(w);
addEdge(x,y,w);
addEdge(y,x,w);
}
for(int i=1; i<=m; ++i) {
read(qu[i]),read(qv[i]);
}
sum=n; //写成sum=0疯狂T
fiz[0]=2e9;
getRoot(1,0);
printf("%d\n",solveAt(rt));
return 0;
}
[P4886] 快递员的更多相关文章
- 【题解】P4886快递员
[题解]P4886 快递员 淀粉质好题!!!加深了我对点分治的理解.最近分治学了好多啊. 题目大意 给定你一颗有边权的树,再给你\(m\)和点对,请你在树上选出来一个点,使得所有点对到这个点的距离的最 ...
- [洛谷P4886]快递员
题目大意:一个$n$个点的树,树上有$m$个点对$(a,b)$,找到一个点$x$,使得$max(dis(x,a_i)+dis(x,b_i))$最小 如果做过幻想乡的战略游戏这道题,应该这道题的思路一眼 ...
- luogub P4886 快递员(点分治)
记得是9月月赛题,当时做的时候觉得跟ZJOI2015幻想乡战略游戏那道题很像???,就写了,然后就写挂了... 我们发现假设当前点为根,我们算出\(m\)次询问中最远的\(a\)对点,如果这\(a\) ...
- 【洛谷 P4886】 快递员 (点分治)
这题因为一些小细节还是\(debug\)了很久...不过我第一次用脚本对拍,不亏. 先随便找一个点作为根,算出答案,即所有点对到这个点的距离和的最大值,并记录所有距离最大的点对.如果这个点在任意一个距 ...
- easyUI定区关联快递员js代码
easyUI定区关联快递员js代码: <script type="text/javascript"> $.fn.serializeJson=function(){ va ...
- Luogu_4886 快递员
Luogu_4886 快递员 一道淀粉质的题目. 先考虑最简单的算法,那便是对每个点都求一边.时间复杂度O(NM) 然后如果我们把每个点的结果对应一个高度,我们会发现.最优解是在这个对应高度形成的三维 ...
- Android动画之仿美团加载数据等待时,小人奔跑进度动画对话框(附顺丰快递员奔跑效果)
Android动画之仿美团加载数据等待时,小人奔跑进度动画对话框(附顺丰快递员奔跑效果) 首句依然是那句老话,你懂得! finddreams :(http://blog.csdn.net/finddr ...
- 项目一:第七天 CRM 和bos系统实现定区关联客户,关联快递员. 通过CXF框架实现
定区关联客户 需求:为了快递方便客户下订单(发快递),派快递员上门取件. 所以说需要让定区关联客户(知道客户属于哪个定区),定区跟快递员关系:多对多.知道让哪个快递员上门取件. 将CRM系统中,客户 ...
- 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据
1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...
随机推荐
- IIS Express(7.0) HTTP 错误 500.22 - Internal Server Error(vs2013)
1.错误如下: HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置. 解决的方法: 首先,找到本地appcmd.x ...
- Appium+Python自动化 4 -appium元素定位
appium定位app上的元素方式 在前面文章中有介绍,(通过UIautomator工具查看app元素) appium定位app上的元素,可以通过id,name,class这些属性定位到 1.id 定 ...
- 详细分析LoadRunner参数化
在进行网页的性能测试时,对网页的登录界面进行压力测试情况下就会使用到多用户进行登录,就需要对登录名和密码进行参数化,那么loadrunner怎么参数化设置呢?下面我们来详细分析一下. 一.我们这里通过 ...
- 第八周助教工作总结——NWNU李泓毅
1.助教博客链接: https://www.cnblogs.com/NWNU-LHY/ 2.作业要求博客链接: http://www.cnblogs.com/nwnu-daizh/p/10687492 ...
- Oracle中特殊的变量类型
1.%TYPE 允许用户动态地将数据库中某一列的数据类型与PL/SQL中某个变量关联.语法如下: variable_name table.column%TYPE 2.%ROWTYPE 允许用户定义 ...
- redis学习-集合set常用命令
redis学习-集合set常用命令 1.sadd:添加一个元素到集合中(集合中的元素无序的并且唯一) 2.smembers:查看集合中所有的元素(上图事例) 3.srem:删除结合中指定的元素 4 ...
- Unity编辑器扩展-Custom List, displaying data your way
本文转自http://catlikecoding.com/unity/tutorials/editor/custom-list/ Custom List, displaying data your w ...
- Python连接oracle数据库的基本操作
1,创建数据库连接connect和关闭数据库连接close 1.1 创建数据库连接的三种方式: 方法一:用户名.密码和监听分开写 import cx_Oracle db=cx_Oracle.conne ...
- 关于Asp.net事件,如何在触发子控件的事件时,同步触发父页面的事件
对页面引用自定义控件后,通过绑定自定义事件,页面绑定子控件的事件,在子控件做了某些修改动作后,如何同步操作父页面的方法:下面我煮了个栗子,同学们可以来尝一尝试一试 a.aspx 引用 UserCont ...
- 基于UML的高校教务管理系统的设计与实现
一.基本信息 标题:基于UML的高校教务管理系统的设计与实现 时间:2018 出版源:南昌航空大学 领域分类:教育信息化:教务管理系统:UML:SSH:Oracle 二.研究背景 问题定义:高校教务管 ...