C ++迭代矢量副本
Posted
技术标签:
【中文标题】C ++迭代矢量副本【英文标题】:C++ iterating over vector copy 【发布时间】:2017-05-16 15:17:38 【问题描述】:我正在尝试实现 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 )
非常感谢您的帮助。
【问题讨论】:
打印不正确怎么知道结果是正确的? 如果我使用 networkx 的 clique 函数,它会返回最后一个结果,这是正确的。 如果这个问题中有MCVE,我会彻底调查。而且它非常接近完成! 【参考方案1】:在wikipedia page 中,递归调用如下所示:
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);
应该在递归调用之后紧跟R.pop_back(node)
。
【讨论】:
以上是关于C ++迭代矢量副本的主要内容,如果未能解决你的问题,请参考以下文章
Angular - 达到 10 次 $digest() 迭代。创建数组的深层副本时中止
为啥在Visual Studio中擦除位置之前矢量的c ++迭代器也无效?
在 .NET 中,使用“foreach”迭代 IEnumerable<ValueType> 的实例会创建一个副本吗?那么我应该更喜欢使用“for”而不是“foreach”吗?