Luogu P1099 「树网的核」

这道题最恶心的是题面。
最痛快的是Floyd。
简易版题面描述:
给出一颗无根有权树,定义其直径为其最长链的长度;
定义一个点i到一条链p的距离为( min(d(i,j)) ),
其中( j \in p );
寻找一条处于任意一条直径上的,长度不超过s的链,使所有点到该链的距离的最大值最小。

·第一步:由于是一棵树,所以可以用Floyd求出任意两点之间的距离,从而求出直径D以及直径的两个端点L,R。

·第二步:遍历每一个点$ i $,如果d[L][i]+d[i][R]==D则说明i在直径上。将i加入到一个表示直径的点集中。

·第三步:枚举直径中的所有点集(i,j),如果d(i,j)<=s,则构成一个合法的链Q。遍历图内的每一个点s,求$ max(dis(Q,s)))$;如果该值小于答案则更新。

·这里有一点:我们可以通过这样一个公式,O(1)求点s到链Q的最短距离即dis(Q,s):

$ dis(Q,s)=(d(s,x)+d(s,y)-d(x,y))/2 $

其中x,y为链Q的两个端点。

证明:设点s到链Q最近的点p,则
$ d(s,x)=d(s,p)+d(p,x) $
$ d(s,y)=d(s,p)+d(p,y) $
且$ d(p,x)+d(p,y)=d(x,y) $
所以$ d(s,p)=\frac{(d(s,x)+d(s,y)-d(x,y))}{2} $

嗯就是这么多。

转载于:https://www.cnblogs.com/soul-M/p/9562754.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值