gpt4 book ai didi

c++ - 使用 C++ boost 库从图中删除顶点及其所有邻居

转载 作者:搜寻专家 更新时间:2023-10-31 00:43:40 24 4
gpt4 key购买 nike

我想从图 G 中删除一个顶点 w 及其邻居。

我的代码:

// remove all neighbours
MyGraph::adjacency_iterator n_iter, n_end;
for (tr1::tie(n_iter, n_end) = boost::adjacent_vertices (*w, G1); n_iter != n_end; ++n_iter)
{
boost::remove_vertex(*n_iter, G1);
}

MyGraph::vertex_iterator vertex_iter, vertex_end;
Vertex vertex_w = G[*w];

// remove vertex himself
for (tr1::tie(vertex_iter, vertex_end) = boost::vertices(G1);vertex_iter != vertex_end; ++vertex_iter)
{
Vertex vertex = G1[*vertex_iter];
if (vertex.p_index == vertex_w.p_index)
{
boost::remove_vertex(*vertex_iter, G1);
break;
}
}

我尝试遍历相邻的顶点并删除它们。之后我尝试删除顶点 w。

但是在启动程序时出现了一些异常和错误。

有没有人提示我从图中删除顶点 w 及其所有邻居?

更新:现在我明白了为什么上面的代码不起作用(我正在使用 VertexList=vecS)。我现在尝试将顶点标记为“已删除”并希望删除所有边。

图表:

0     1
o-----o
| |
| |
o-----o
2 3

代码:

typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS, Vertex, Edge> MyGraph;
[...]
// *w is Vertex "1"
boost::graph_traits<MyGraph>::adjacency_iterator n_iter, n_end, next;
for (tr1::tie(n_iter, n_end) = boost::adjacent_vertices (*w, G1); n_iter != n_end; ++n_iter)
{
cout << G1[*n_iter].p_index << endl;
G1[*n_iter].Graph_Part = Graph_Part::R;
// boost::clear_vertex(*n_iter, G1); <-- problem
}
cout << endl << "----" << endl;

如果我取消注释 clear_vertex 方法,输出为:

0
3

如果程序去掉*n_iter的边,输出只有:

0

- 循环在一次迭代后结束。

最佳答案

看看here . remove_vertex 不会改变任何边。您需要先clear_vertex它。

一般提示:不要使用对 boost::graph 库的限定调用,调用它们是非限定的。我还建议 Boost.Range在这种简单的情况下处理迭代。它使范围更清洁并且更漂亮。

关于c++ - 使用 C++ boost 库从图中删除顶点及其所有邻居,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10305019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com