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} $
嗯就是这么多。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步