【问题标题】:Clear vertex of all neighbors of v清除 v 的所有邻居的顶点
【发布时间】:2021-12-30 23:07:48
【问题描述】:

我正在使用 Boost Graph 在 C++ 中实现一个算法。

我想在v(所以,它的所有邻居)附近找到所有顶点,然后更改其属性,最后清除所有边缘。

我在 Boost 中找到了函数 adjacent_vertices(v,g)(其中 v 是顶点,g 是图形)来查找所有邻居。然后我想对它们都应用函数clear_vertex(v,g)(同样,v 是顶点,g 是图形)来删除它们的所有边。

在这一点上,我有一个问题。 adjacent_vertices函数返回一对adjacency_iterator,而对于clear_vertex函数我需要vertex_iterator(如果我正确地理解这些功能如何工作)。

那么,有一种简单的方法可以将adjacency_iterator 转换为vertex_iterator?如果我保留@ 987654331并将其传递给clear_vertex函数,问题就是它不会删除边缘(或随机将它们删除到某个顶点)。

我的错误代码是:

Graph::adjacency_iterator v,vend;
        for(boost::tie(v,vend) = neighbours; v != vend ; ++v) {
            clear_vertex(*v,g2);
        }

【问题讨论】:

标签: c++ graph boost


【解决方案1】:

这取决于边缘容器选择器。

最简单的方法是容器是基于节点的,即只有任何被移除边的迭代器/描述符无效。

另一种方法是将“查询”和“修改”方面分开,例如

Compiler Explorer

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/random.hpp>
#include <random>

void clear_all_neighbours(auto v, auto& g) {
    auto neigh = adjacent_vertices(v, g);
    std::set to_clear(neigh.first, neigh.second);

    for (auto u : to_clear)
        clear_vertex(u, g);
}

int main()
{
    std::mt19937            prng(std::random_device{}());
    boost::adjacency_list<> g;
    generate_random_graph(g, 1000,2000, prng);
    std::cout << "Before: " << num_edges(g) << "\n";

    auto v = vertex(prng() % num_vertices(g), g);
    clear_all_neighbours(v, g);

    std::cout << "After: " << num_edges(g) << "\n";
}

可能的输出:

Before: 2000
After: 1983

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多