最小直径生成树算法

时间:2010-10-28 09:33:05

标签: algorithm graph tree graph-algorithm spanning-tree

给定一个无向和连通的图G,找到一个直径最小的生成树。

1 个答案:

答案 0 :(得分:5)

singhsumit将相关论文与Hassin and Tamir相关联,标题为“关于最小直径生成树问题”,但他的答案目前已被删除。本文的主要思想是在无向图中找到最小直径生成树可以通过找到图的“绝对1中心”并返回根植于那里的最短路径树来完成。

绝对1中心是在顶点或边缘上的点,距离最远点的距离最小。这可以通过Kariv和Hakimi的算法(网络位置问题的算法方法.I:p-中心)或Hakimi,Schmeichel和Pierce的早期算法(网络中的p-中心)找到,我将试图从运行时间和数十年的后见之明重建。 (愚蠢的支付墙。)

使用Floyd - Warshall或Johnson的算法计算所有对距离。对于每个边缘u - v,找到该边缘上1个中心的最佳候选者,如下所示。

让边缘上的点u - v被指数为μ,范围从0(u本身)到len(u-v)(v本身)。从索引μ处的点到顶点w的距离是

  

min(μ+ d(u,w),len(u - v) - μ+ d(v,w))。

作为μ的函数,该量增加然后减少,最大值

  

μ=(len(u - v)+ d(v,w) - d(u,w))/ 2。

按此argmax对顶点进行排序。对于阵列的每个分区,进入左子阵列和右子阵列,计算引起相同argmax分区的μ的区间[a,b]。将此间隔与[0,len(u - v)]相交;如果交叉点是空的,那么继续前进。否则,找到左子阵列中的最大距离L,从u-v上的点索引a,并且右子阵列中的最大距离R从u-v上的点开始,由b索引。 (通过在开头从左到右和从右到左扫描,计算这些最大值的成本可以分摊到每个分区的O(1)。)最佳选择是[a,b]中的μ最小化max(L - (μ - ​​a),R +(b - μ))。