树的直径(最长路)问题

问题:如果知道某图为无环连通图,图中各节点之间的连通关系已知,如何选取图中的点,作为根节点,使得该图构成的树最深?

首先最先想到的是暴力破解,用dfs深度优先搜索,把每个点作为根节点的情况都遍历一遍,每次记录下当前树的深度,找到最深的情况,但是这种做法很费时间,尤其是当树中的节点非常多时。

这时,我们必须借助一个性质:
①从树的任何一个节点出发,找到距离它最远的节点,那么这个节点一定在树的直径的一端。②从节点的一端出发,找到距离它最远的节点,那个节点一定在树的直径的另一端。

这个性质可以用反证法证明。
参考:http://www.cnblogs.com/wuyiqi/archive/2012/04/08/2437424.html
将树直径的起点和终点记为S-T,我们最开始选取的节点为U。现在我们不知道S-T的具体位置。
情况一,S-T经过U。那么距离U最远的节点一定是S或T中的一个。
证明如下:假设,距离U最远的节点是X,X不是S也不是T。
那么:d(U-X)>d(U-S)。这样,d(T-U)+d(U-X)>d(T-U)+d(U-S)。
既:d(T-X)>d(T-S)。这样的结论与S-T是树的直径的起点和终点的前提相矛盾。
所以假设错误,原结论成立。
情况二,S-T不经过U,那么距离U最远的节点一定是S或T中的一个。
证明如下:假设,距离U最远的节点是X,X不是S也不是T。
那么:d(X-U)>d(S-U)。
在S-T上可以找到一点P,满足条件从P出发能够到达S,且不需要进过S-T上的其他节点。
既:d(S-U)=d(S-P)+d(P-U),所以:d(X-U)>d(S-P)+d(P-U)
所以:d(X-U)>d(S-P),所以:d(X-U)+d(U-P)>d(S-P) 既:d(X-P)>d(S-P)
所以:d(X-P)+d(P-T)>d(S-P)+d(P-T) 既:d(X-T)>d(S-T)
这样的结论与S-T是树的起点和终点的前提相矛盾。
所以假设错误,原结论成立。

相关问题:https://www.patest.cn/contests/pat-a-practise/1021

这道题事实上将难度更上升了一个层次,本质是要求将树的所有直径的所有端点找出来。如果只是要求一条直径,我们进行两次dfs就可以了,第一次求出一个断点,第二次求出另一个端点。解这道题的方法是:先从任意一个节点出发,记录下离它最远的所有节点,再从这些节点中的任意一个出发,记录下离这个节点最远的所有节点,两个集合去重,就是最后的结果
这种解法也是利用了以下性质:
从树的任何一个节点出发,所有最远的点构成的集合一定包含了所有的直径的某一端(也就是说,不存在哪条直径的两个端点都不在集合里),这个性质同样可以通过反证法证明,不再赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值