算法导论22.2-7

从任意起点开始,运行一次BFS,得到一个最远点d1,d1即为直径的一点

再运行一次BFS,得到一个最远点d2,则d1~d2为树的直径

为什么这样是对的?

(1)证明d1是树直径的一点

a) 若s在直径d1,d2上,则最后一个点必能搜到d1或d2;因为若搜到最后一个点为v,则直径为vd2,与题意不符

     b) 若s不在直径d1,d2上,BFS搜到的最远点为v,d1-d2为直径,根据连通图的性质,

            路径s-v当中必有一点t1,与路径d1-d2相连

 .

根据d1-d2直径定义 d1d2=d2t2+t2d1,且t2d1>=t2t1+t1v,否则直径为d2-t2-t1-v

    根据v是BFS搜到的最远点,t1v>=t1t2+t2d1,最远点为d1

    根据两个不等式可得

    t1t2=0

t1v=t2d1

(2)通过d1进行BFS,最后搜到的点必为d2

因为若搜到最后一个点为v,则直径为vd1,与题意不符

 

转自:http://www.cnblogs.com/inpeace7/archive/2012/04/18/2454996.html

posted @ 2012-05-06 09:05  freewater  阅读(611)  评论(0编辑  收藏  举报