c+中的Bron-Kerbosch算法+; 我一直在实践我的C++算法知识,并坚持在标准的BK实现。算法输出了太多的派系,我似乎不明白为什么。我将图形表示为邻接列表: vector< list<int> > adjacency_list;
我是否应该在第一个循环中使用p的副本?(我在相关期刊上看到过这一点)c+中的Bron-Kerbosch算法+; 我一直在实践我的C++算法知识,并坚持在标准的BK实现。算法输出了太多的派系,我似乎不明白为什么。我将图形表示为邻接列表: vector< list<int> > adjacency_list;,c++,algorithm,C++,Algorithm,我是否应该在第一个循环中使用p的副本?(我在相关期刊上看到过这一点) 谢谢您的帮助。是的,您应该复印一份,除非您事先预留了空间,以保证不会重新定位1。(注意C++ Frace实现归结为一组在引擎盖下的迭代器) 如果我是你,我会重铸一个老式的for循环,使用std::size\u t(超级学究2会使用std::vector::size\u type)在向量上迭代,以索引你当前感兴趣的向量元素。读取P的最后一个元素后终止 参考资料: 一, 2如果我理解正确,感谢您的富有洞察力的评论,如:for(
谢谢您的帮助。是的,您应该复印一份,除非您事先预留了空间,以保证不会重新定位1。(注意C++ <代码> Frace实现归结为一组在引擎盖下的迭代器) 如果我是你,我会重铸一个老式的
for
循环,使用std::size\u t
(超级学究2会使用std::vector::size\u type
)在向量上迭代,以索引你当前感兴趣的向量元素。读取P
的最后一个元素后终止
参考资料: 一,
2如果我理解正确,感谢您的富有洞察力的评论,如:for(std::vector::size_type I=0;I!=v.size();I++){/*std::cout应该没问题。
push_back
不会使i
无效。即使i
在最后一个元素上。效果很好!谢谢。@Bathsheba为什么要使用副本?我有一个类似的问题,但不明白为什么需要副本。你最终是如何解决的?你在哪里添加了这个P副本的?
void graph::BronKerbosch(vector<int> R, vector<int> P, vector<int> X){
if (P.empty() && X.empty()){
result_cliques.insert(R);
}
for (int node : P){
vector<int> intersection = {}, intersectionX = {};
//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());
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";
}
}
for (int node : P){