Warm tip: This article is reproduced from serverfault.com, please click

algorithm-如何在图中找到顶点子集的“中心”?

(algorithm - How to find the "center" of a subset of vertices in a graph?)

发布于 2020-11-20 15:05:55

我有一个无向的,正加权的,具有顶点V和边的连通图E我也有一个S顶点子集现在V包含大约22000个顶点和E大约23000个边,但是对于较大的输入,这些点预计将增加到大约一百万个。S另一方面,通常包含少于1000个顶点,并且它们在图中相对靠得很近。

我想找到的“中心” S,它是一个顶点cV从该顶点到最远顶点的距离应S尽可能小。它就像图中心,但仅用于部分顶点。[编辑:]这也是图形上的1个中心的问题更为普遍的k中心问题是NP困难的,但这一问题可能更容易。

是否有一种算法可以有效地找到该中心?理想情况下,性能仅取决于S其周围环境,而不取决于整个图形。

我想过开始从所有顶点的广度优先搜索s_iS同时,当一个顶点停止v_i已经被所有遇到的s_i,但是这是不是太有效。在这种情况下这可能是可行的,但感觉似乎有更好的方法。

Questioner
Thomas
Viewed
0
David Eisenstat 2020-11-28 22:54:56

我不知道如何分析该算法,也没有引文,但似乎可行。

  1. 选择一个出发中心。你当前的近似值应该可以很好地解决此问题。

  2. 计算从当前中心到S的最短路径树。

  3. 修剪树,以便所有叶子都属于S并计算其中心。

  4. 如果此中心比根中心好,请返回到步骤2。

关于该算法,我可以真正声明的两个形式属性是:它总是终止,并且永远不会比起始中心差(因为如果树的中心不是根,那么它必须是比根更好的中心,因为缺少的边缘可以改善它,但不能改善根部)。

为了有效地计算树的中心,请在每个节点的所有后代中以最大距离标记每个节点(在线性时间内,通过按后顺序访问这些节点)。然后通过带有最大标签的子项下降到树中,只要它能改善半径。孩子的子树中的所有内容都将随着孩子的父边缘的长度而变得更近。其他一切都将以相同的数量增长。