Chiaro vertice di tutti i vicini di casa di v

0

Domanda

Sto implementando un algoritmo in C++ con un Boost Grafico.

Voglio trovare tutti i vertici, nel quartiere di v (così che tutti i suoi vicini di casa), quindi modificare una proprietà di loro e, infine, cancellare tutti loro bordi.

Ho trovato in Amplificare la funzione adjacent_vertices(v,g) (dove v è il vertice e g è il grafico) per trovare tutti i vicini di casa. Poi voglio applicare in tutti loro la funzione di clear_vertex(v,g) (di nuovo, la v è il vertice e g è il grafico) per rimuovere tutti i bordi.

A questo punto, ho un problema. Il adjacent_vertices la funzione restituisce una coppia di adjacency_iteratormentre per il clear_vertex la funzione di cui ho bisogno vertex_iterator (se ho capito bene come queste funzioni di lavoro).

Così, c'è un modo semplice per trasformare il adjacency_iterator in vertex_iterator? Se tengo il adjacency_iterator e la passa al clear_vertex funzione, il problema è che non rimuove i bordi (o rimuovere in modo casuale ad alcuni vertici).

Il mio sbagliato il codice è:

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

Migliore risposta

2

Dipende dal bordo del contenitore di selettori.

Il modo più semplice è quando i contenitori sono node-based, cioè solo gli iteratori/descrittori per qualsiasi rimosso i bordi non sono più validi.

Un altro modo è quando si divide la "query" e "modifica" aspetti, ad es.

Compilatore 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";
}

Uscita possibile:

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

In altre lingue

Questa pagina è in altre lingue

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