最小直径生成树的算法

Ram*_*mbo 3 algorithm tree graph spanning-tree graph-algorithm

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

Dav*_*tat 5

singhsumit链接了Hassin 和Tamir的相关论文,题为“关于最小直径生成树问题”,但是他的答案目前被删除。本文的主要思想是,通过找到图的“绝对1中心”并返回以该图为根的最短路径树,可以在无向图中找到最小直径的生成树。

绝对1中心是顶点或边缘上的点,从该点到最远顶点的距离最小。这可以通过Kariv和Hakimi的算法(网络位置问题的算法方法,我:p中心)找到,也可以通过Hakimi,Schmeichel和Pierce的早期算法(在网络中的p中心上)找到。尝试从运行时间和数十年的事后洞察力中进行重构。(愚蠢的付费墙。)

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

令u–v边上的点的索引范围为0(u本身)到len(uv)(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)]相交;如果相交处为空,则继续前进。否则,找到左子数组中距u--v上由a索引的点的最大距离L,以及右子数组中距u--v上由b索引的点的最大距离R。(通过在开始时从左到右和从右到左扫描,每个分区的计算这些最大值的费用可以摊为O(1)。)最佳选择是[a,b]中的µ最小化max(L-(µ-a),R +(b-µ))。

  • @galath如果从边缘中心到顶点的距离的argmax最大为µ = 0、0.2、0.5、0.7、0.9、1,则[a,b]区间用于划分[0,0.2,0.5] [0.7 ,0.9,1]是间隔[0.5,0.7]。 (2认同)