我正在尝试实现Bron-Kerbosch的算法,这是一种用于集团发现的递归算法。我设法达到一个点,它返回正确数量的派系,但是当我打印它们时,它们不正确 - 添加了额外的节点。我错过了一些明显的东西吗?
我正在使用邻接列表结构:
vector< list<int> > adjacency_list;
我用以下方式添加边缘:
void graph::addEdge(int i1,int i2){
//as this is an undirected graph
adjacency_list[i1].push_back(i2);
adjacency_list[i2].push_back(i1);
}
主要算法如下:
void graph::BronKerbosch(vector<int> R, vector<int> P, vector<int> X){
if (P.empty() && X.empty()){
result_cliques.insert(R);
}
// vector <int> tmpVerts = P;
for(std::vector<int>::iterator it = P.begin(); it != P.end();) {
vector<int> intersection = {}, intersectionX = {};
int node = *it;
//N(P)
for (int nodeP : adjacency_list[node]){
for (int node2 : P){
if (nodeP == node2){
intersection.push_back(nodeP);
}
}
//N(X)
for (int node3 : X){
if (nodeP == node3){
intersectionX.push_back(nodeP);
}
}
}
R.push_back(node);
BronKerbosch(R,intersection,intersectionX);
//P.erase(remove(P.begin(),P.end(),node),P.end());
P.erase(it);
X.push_back(node);
}
}
我在其中运行:
void graph::run_BronKerbosch(){
vector<int> R,P,X;
for (int i=1; i < adjacency_list.size(); i++) {
P.push_back(i);
}
BronKerbosch(R,P,X);
cout << "................\nClassic: " << result_cliques.size() << endl;
for (auto clique : result_cliques){
cout << "(";
for (int node : clique){
cout << node <<" ";
}
cout << ")\n";
}
}
以下图输入的输出问题:
1 2
1 3
2 3
是,此代码返回:
(1 2 3 )
(1 2 3 4 )
(1 2 3 4 5 )
然后它应该返回(使用python):
(1 2 3 )
(2 4 )
(2 5 )
非常感谢您的帮助。
答案 0 :(得分:1)
在wikipedia page中,递归调用如下所示:
if (isset($_GET['value1']) && isset($_GET['value1']) && isset($_GET['isChecked'])) {
$errorMessage = "";
if (isset($_GET['isChecked']) == 'false'){
$errorMessage = "The check box is false";
} else {
$errorMessage = "The check box is true";
}
echo json_encode("$errorMessage"); // But how I handle it in the AJAX error:?
}
在问题的代码中,您在递归调用之前执行for each vertex v in P:
BronKerbosch1(R ⋃ {v}, P ⋂ N(v), X ⋂ N(v))
...
,但该节点将在循环的所有后续迭代中包含在R.push_back(node)
中,这是不正确的。
即,以下说明:
R
在递归调用之后,可能应该紧跟R.push_back(node);
BronKerbosch(R,intersection,intersectionX);
。