清楚的顶点的所有邻居的v

0

的问题

我执行一个算法在C++的升的曲线图。

我想找到所有的顶点附近v(所以,其所有邻国),然后变化财产的最后清除所有他们的边缘。

我发现在提高功能 adjacent_vertices(v,g) (此处v是顶点和g的图表)找到所有的邻居。 然后我想到适用于所有的它们的功能 clear_vertex(v,g) (再次,v为顶点和g的图表)删除所有他们的边缘。

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

因此,有一个简单的方法要改变 adjacency_iteratorvertex_iterator? 如果我保留 adjacency_iterator 并通过它的 clear_vertex 功能,问题是,它不会删除的边缘(或消除他们中随机的一些顶点).

我的 错误 代码是:

Graph::adjacency_iterator v,vend;
        for(boost::tie(v,vend) = neighbours; v != vend ; ++v) {
            clear_vertex(*v,g2);
        }
boost c++ graph
2021-11-20 15:27:28
1

最好的答案

2

它取决于边缘容器的选择。

最简单的方法是当容器节点为基础,即只有迭代/描述的任何移动边缘无效。

另一种方式是当你拆分"查询"和"修改"方面,例如

编译器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
2021-11-20 16:24:20

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................