从任意起点开始,运行一次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