「树的直径」BFS方法证明

树的直径算法
本文介绍了一种求解树直径的有效算法:首先从任意节点出发,通过广度优先搜索(BFS)找到离该节点最远的点s;再从s出发进行BFS找到离s最远的点t,则s到t的距离即为树的直径。文章还提供了详细的证明过程。

选定任意一个点u,从u开始BFS求出距离u最大的点s,再从s点出发BFS到距离s最大的点t,则dis(s,t)即为树的直径

证明

其实只要找到了树的直径的一个端点,再BFS找到最远点就一定是直径的另一个端点,这一点毋庸置疑。所以解法的后半部分一定是正确的,只需要证明第一次BFS找到的最远点k就是其中一个端点s。

(一):u在直径上:反证法:若点k不是直径的端点,这意味着dis(u,k)+dis(u,t) < dis(u,s)+dis(u,t),两边同时减去dis(u,t),得dis(u,k) < dis(u,s),而因为k是距离u的最远点,与做法不符。故k是直径的端点。

(二):u不在直径上:

  ① 在路径(u,k)与路径(u,s)上有交点x,那么我们可以把x想象成(一)中的u,那么从这个交点x出发所到达的最远点就是端点s,而从u到x之后一定是走最远的,所以k一定是端点。

  ②如果不相交,那也就意味着k完全走到另外一边去了,也就是dis(u,k)>dis(u,s)且dis(u,k)>dis(u,t)。这样一来利用不等式的性质同时加上dis(u,k),dis(u,k)+dis(u,s) > dis(u,t) + dis(u,s)

转载于:https://www.cnblogs.com/qixingzhi/p/9275225.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值