这道题最恶心的是题面。
最痛快的是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} $
嗯就是这么多。