码迷,mamicode.com
首页 > 其他好文 > 详细

生成树的直径求法

时间:2016-07-23 19:39:26      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

本来以为是一个比较难的算法,结果两遍bfs就可以了,不得不佩服那些大牛们。

先任取一个点u,一遍bfs找到距离它最远的点v,然后取vbfs一遍,最远的距离就是生成树的直径。

证明:

 1:若u为直径上的点,那么到u最远的点必定是直径的端点,假设直径端点是x,y且d{x,u}>d{y,u};当前最远点是v;那么如果的d{v,u} > d{x,u};那么d{v,u}+d{y,u} > d{x,y};与x,y是直径矛盾。

 2:u不在直径上,设m为直径上到u最近的点,设x,y为这条直径的端点且d{x,m} > d{y,m};由1知,对于m来说,在所有点中,m到x的距离最远,因为d{u,x} = d{u,m} + d{m,x};且取任意点z,必定存在d{u,z} <= d{u,m}+d{m,z};因为d{m,x}最大,z = x时所以d{u,z} 最大。所以到u最远的点必定是端点。

生成树的直径求法

标签:

原文地址:http://www.cnblogs.com/zstu-zy/p/5699309.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!