博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[P4886] 快递员
阅读量:4647 次
发布时间:2019-06-09

本文共 930 字,大约阅读时间需要 3 分钟。

考虑在树上选个点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]

转载于:https://www.cnblogs.com/nosta/p/10230090.html

你可能感兴趣的文章
CodeForces743E. Vladik and cards 二分+状压dp
查看>>
GO语言面向对象
查看>>
1111评论
查看>>
CodeForces 546E - Soldier and Traveling(最大流)
查看>>
linux下(Window当然也可以)解决idea创建maven项目导入过慢问题
查看>>
如何设计一个完美的权限管理模块
查看>>
layer---口碑极佳的web弹层组件
查看>>
自己的一些简要学习点
查看>>
HTPJ 1268 GCD
查看>>
细说程序员最后归宿
查看>>
hdu2063 匈牙利算法 二分最大匹配模版题
查看>>
工作中的一些经验小结
查看>>
【编程题目】数组中超过出现次数超过一半的数字 ☆
查看>>
php 加密解密类
查看>>
10 款简单精美的 jQuery 和 CSS3 表单
查看>>
云计算开发一般负责什么工作呢?云计算是做什么的?
查看>>
[转]Windows Shell 编程 第十二章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987999】...
查看>>
ubuntu常用技巧积累
查看>>
Java入门第二季——Java中的this关键字
查看>>
MYSQL指令
查看>>