Jasný vrchol všech sousedů v

0

Otázka

Jsem implementaci algoritmu v jazyce C++ s Boost Graph.

Chci najít všechny vrcholy v okolí v (takže všechny své sousedy), pak změna majetkem a konečně vymazat všechny jejich hrany.

Našel jsem v Boost funkce adjacent_vertices(v,g) (kde v je vrchol a g je graf) najít všechny sousedy. Pak chci použít na všechny funkce clear_vertex(v,g) (opět, v je vrchol a g je graf) odstranit všechny jejich hrany.

V tomto bodě, mám problém. Na adjacent_vertices funkce vrací dvojici adjacency_iterator, zatímco pro clear_vertex funkce potřebuji vertex_iterator (pokud jsem správně pochopil, jak tyto funkce pracují).

Takže, tam je snadný způsob, jak transformovat adjacency_iterator v vertex_iterator? Pokud jsem se udržet adjacency_iterator a předat ji do clear_vertex funkce, problém je, že to neznamená, odstranění okrajů (nebo je odstranit náhodně na některé vrcholy).

Můj špatný kód je:

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

Nejlepší odpověď

2

To závisí na okraj nádoby voliče.

Nejjednodušší způsob je, když jsou kontejnery node-based, tj. pouze iterátory/deskriptory jakékoli odstraněny hrany jsou neplatné.

Další způsob je, když si rozdělit "dotaz" a "modifikace" aspekty, např.

Kompilátor 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";
}

Možné výstupy:

Before: 2000
After: 1983
2021-11-20 16:24:20

V jiných jazycích

Tato stránka je v jiných jazycích

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