c+中的Bron-Kerbosch算法+; 我一直在实践我的C++算法知识,并坚持在标准的BK实现。算法输出了太多的派系,我似乎不明白为什么。我将图形表示为邻接列表: vector< list<int> > adjacency_list;

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(

我是否应该在第一个循环中使用p的副本?(我在相关期刊上看到过这一点)


谢谢您的帮助。

是的,您应该复印一份,除非您事先预留了空间,以保证不会重新定位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){