树的直径最长路证明

http://www.cnblogs.com/justPassBy/p/4363362.html

树间距离最长的两点所形成的路径叫做树的最长路

设这条路为s->t.

很容易想到的方法是以每个点为起点当做s,然后dfs求t。  时间复杂度是O(V*(V+E))

但有更简单的方法是,以任意点u进行dfs找到最远点,这个最远点为s或t,然后以这个最远点进行dfs,即可找到最长路

那么如何证明以任意点u进行dfs找到最远点,这个最远点为s或t呢??

为了写证明更简洁,我们设这点最远点为t

证明如下:

(1)点u为最长路s->t上的点,那么以u为起点搜到的最远点肯定为s或t,如果不是,那么很显然,s->t不是最长路

(2)点u不是最长路上的点,那么又分为两种情况

  a:以点u搜到的最远点形成的路径与s->t有交点x,那么这条路的形成分为两个步骤,从u走到x,再从x搜最远点(又回到了第一种情况),

  b:以点u搜到的最远点为T的路径与s->t没有交点,又因为图是联通的,那么可以从u走出一条路,该路与s->t有交点k。那么如图

  

那么 dist(u,T) > dist(u,k) + dist(k,t)

-->dist(u,T) > dist(k,t)

-->dist(u,T) + dist(s,k)+dist(u,k) > dist(k,t) + dist(s,k) = dist(s,t)

那么最长路就变成了dist(u,T) + dist(s,k)+dist(u,k)。与假设矛盾

 

所以又上面的证明可知,

以任意点u进行dfs找到最远点,这个最远点为s或t(以任意点出发的最长路与树的最长路一定有交点)


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值