图的中心点

时间:2013-03-28 05:40:07

标签: algorithm graph

我在思考如何定位图的中心点时遇到了一些麻烦;也就是说,图表上的节点最小化了与所有其他节点的最大距离。

例如:

假设我有一个包含3个节点的图表,排成一行(如1-2-3)。

显然,很容易看出此图的中心点是2。我怎样才能实现类似的东西呢?

我所知道的唯一算法是BFS / DFS / Prim's /和Kruskal。 Prim和Kruskal的算法并不适用于这种情况。我想我需要在这里使用BFS吗?唯一的问题是,BFS是否会根据您从哪个节点返回不同的顺序?

2 个答案:

答案 0 :(得分:3)

对于相当密集的图表:

  1. 使用Floyd-Warshall algorthm
  2. 构建所有最短路径矩阵
  3. 在每一行中找到最大值 - 这是相应顶点(节点)的偏心率
  4. 选择具有最小偏心率的顶点 - 它们是中心节点(最小偏心率是图形半径)
  5. 复杂度O(V ^ 3)(小常数)

    如果图表稀疏,您可以使用每个顶点的BFS或Johnson's algorithm

    (O(V ^ 2 + V * E),O(V ^ 2 * logV + V * E))

    FYE:

    0 1 2   //ecc = 2
    1 0 1   //ecc = 1 - central point
    2 1 0   //ecc = 2
    

    如果您使用树(因为消失的评论中提到了MST) - 有更快的方法:

    1. 来自任何顶点的一个BFS
    2. 发现最远点的另一个BFS
    3. 在第二个BFS的最长路径中获得中间顶点
    4. O(V + E)

答案 1 :(得分:0)

Python模块 NetworkX 提供此类API center(G, e=None)。有关实现,请参阅其源代码here

以佛罗伦萨家族图为例,中心节点用红色着色。

enter image description here

import networkx as nx

G = nx.florentine_families_graph()
center_nodes = nx.center(G)