邻接矩阵和Bron-Kerbosch算法

时间:2015-05-25 13:56:54

标签: c++ algorithm matrix

我想在一个以邻接矩阵形式给我的图中找到最大派系。我正在尝试做的事情我正在获得我需要找到的商店数量,这些商店的商品标签正在被收集,是否找到了足够数量的商店

因此输入顺序排列 x - 店铺数量。 y - 产品数量/标签。 z - 产品需要存在多少个商店。

所以让我说我得到了

5 - x 
2 - y 
4 - z
Then the adjacency matrix going with it is:
0 1 1 1 1
1 0 2 2 1
1 2 0 2 2
1 2 2 0 1
1 1 2 1 0

有两种不同的产品,现在我想知道是否至少有4家商店销售特定产品。我发现了Bron-Kerbosch算法,例如http://en.wikipedia.org/wiki/Bron%E2%80%93Kerbosch_algorithm 但我不知道如何选择我的R,P和X子集以及如何表示它们。它不一定非常高效,我也不认为需要比2D阵列更高级的数据结构,但我不知道如何使用这个邻接矩阵作为我的顶点列表等。任何人都可以让我知道如何开始使用这个算法?可能告诉我如何用我的数据来对待R,P和X就足够了。我想用C ++创建我的程序

1 个答案:

答案 0 :(得分:0)

来自wikipedia article

BronKerbosch3(G):
   P = V(G)
   R = X = empty
   for each vertex v in a degeneracy ordering of G:
       BronKerbosch2(R ⋃ {v}, P ⋂ N(v), X ⋂ N(v))
       P := P \ {v}
       X := X ⋃ {v}

其中G是图表,BronKerbosch2()定义为:

BronKerbosch2(R,P,X):
   if P and X are both empty:
       report R as a maximal clique
   choose a pivot vertex u in P ⋃ X
   for each vertex v in P \ N(u):
       BronKerbosch2(R ⋃ {v}, P ⋂ N(v), X ⋂ N(v))
       P := P \ {v}
       X := X ⋃ {v}

所以现在你知道了你对R,P和X的选择。还要查看评论中提到的邻接矩阵实际上是什么。另外,请仔细阅读文章,以便在算法中使用degeneracy

在C ++中,您可以将std::array<std::array<int, SIZE>, SIZE>用于2D邻接矩阵,然后继续算法。