C 中的Bron Kerbosch算法
Bron Kerbosch algorithm in c++
我一直在练习我的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
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- std::unordered_map 搜索算法是如何实现的?
- 如何实现高效的算法来计算大型数据集的多个不同值?
- C 中的Bron Kerbosch算法