确定图中的一组节点是否为群集

时间:2012-07-09 21:21:11

标签: algorithm graph set graph-algorithm

如果我有一个类似网格的图形和一组节点,如[A,B,J,K]。

Grid Graph:

A B C D
E F G H
I J K L

Note: diagonals not considered neighbours

检查这些节点是否都相邻且形成群集的最佳方法是什么?

在上面的示例中,[A,B]是相邻的,[J,K]是相邻的,但作为一个整体,该集合不形成集群。如果'F'被添加到集合中以形成[A,B,F,J,K],那么我会认为它是一个集群。

更新:我已经有一个函数检查两个节点是否相邻boolean isAdjacent(节点a,节点b)。只需要对其进行扩展即可检查群集。

1 个答案:

答案 0 :(得分:2)

让原始图表为G = (V,E)SET所需的节点集(SET <= V

创建图G' = (V',E'),其中V' = SETE' = { (u,v) | (u,v) is in E and u,v is in SET }

如果图表G'已连接,则您拥有所有元素的集群。
最大聚类是G'中的最大连通分量。

找到最大连通分量可以用flood fill

之类的东西来完成

注意,首先使用带有限制的洪水填充,可以调整G'的图形创建,而无需实际构建它。)

伪代码,使用BFS查找群集:

int maximalCluster(E,SET): //SET is the set of desired nodes, E is the edges in G.
    roots <- new map<node,interger>
    for each node n in SET: 
       //run a BFS for each root, 
       //and count the total number of elements reachable from it
       queue <- { n } 
       roots.put(n,1)
       while (queue is not empty):
           curr <- queue.takeFirst()
           for each edge (curr,u) in E:
              if (u is in SET):
                  SET.delete(u)
                  queue.add(u)
                  roots.put(roots.get(n) + 1)
    return max { roots.get(v) | for each  v in roots.keys } 

虽然上面的伪代码不生成G',但它只通过检查其节点在SET中的边来模拟它。