Jasné vrchole všetkých susedov v

0

Otázka

Som implementácii algoritmu v C++ s Boost Graf.

Chcem nájsť všetky vertex v okolí v (tak, všetkých svojich susedov), potom zmena majetkom a nakoniec vymazať všetky ich okrajoch.

Našiel som v Boost funkcia adjacent_vertices(v,g) (kde v je vrchol a g je graf) nájsť všetky susedov. Potom som sa má vzťahovať na všetky ich funkcie clear_vertex(v,g) (opäť, v je vrchol a g je graf) odstrániť všetky ich okrajoch.

V tomto bode, mám problém. Na adjacent_vertices funkcia vráti pár adjacency_iterator,, zatiaľ čo pre clear_vertex funkcie, ktoré potrebujem vertex_iterator (ak chápem správne, ako sa tieto funkcie pracujú).

Takže, existuje jednoduchý spôsob, ako zmeniť adjacency_iterator v vertex_iterator? Ak som udržať adjacency_iterator a odovzdať ju na clear_vertex funkcia, problém je, že to nie je odstránenie okrajov (alebo ich odstrániť náhodne na niektoré vrcholy).

Môj nesprávny 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

Najlepšiu odpoveď

2

Závisí to od okraja nádoby voličov.

Najjednoduchší spôsob je, keď sú kontajnery uzol báze, t. j. len iterátorov/deskriptory na všetky odstránené hrany sú neplatné.

Iný spôsob je, keď môžete rozdeliť "dotaz" a "úpravy" aspekty, napr.

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ýstup:

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

V iných jazykoch

Táto stránka je v iných jazykoch

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