C 中的Bron Kerbosch算法

Bron Kerbosch algorithm in c++

本文关键字:算法 Kerbosch Bron 中的      更新时间:2023-10-16

我一直在练习我的C 算法知识,并陷入了标准BK实现。该算法输出了太多集团,我似乎并不知道原因。我将图表表示为邻接列表:

vector< list<int> > adjacency_list;

我的BK功能看起来像:

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){

我应该以某种方式使用P副本作为第一个循环吗?(我在一个相关问题中看到了这一点(

感谢您的任何帮助。

是的,除非提前储备空间,否则您应该拿一个副本,这样您就可以保证没有Reallocation 1 。(请注意,C foreach实现归结为引擎盖下的一堆迭代器。(

如果我是您,我会重铸为老式的for循环,使用std::size_t在向量上迭代(Super-Pedants 2 将使用std::vector<int>::size_type(将 CC_4(索引矢量元素。'当前感兴趣。


参考:

1 迭代器无效规则

2 c for -loop- size_type vs.size_t