友链

dreagonm

dummyyummy

fengxunling

BLUESKY007

神犇__stdcall

硕佬maomao9173

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} $

嗯就是这么多。

posted @ 2018-08-30 21:15  soul_M  阅读(142)  评论(1编辑  收藏  举报