Claro vértice de todos los vecinos de v

0

Pregunta

Estoy implementando un algoritmo en C++ con el Impulso Gráfico.

Quiero saber el vértice en el barrio de v (por lo tanto, todos sus vecinos), a continuación, cambiar una propiedad de su y finalmente borrar todos sus bordes.

He encontrado en el Impulso de la función adjacent_vertices(v,g) (donde v es el vértice y g es la gráfica) para encontrar todos los vecinos. A continuación, quiero aplicar en todos ellos la función clear_vertex(v,g) (de nuevo, v es el vértice y g es la gráfica) para eliminar todos los bordes.

En este punto, tengo un problema. El adjacent_vertices la función devuelve un par de adjacency_iterator, mientras que para el clear_vertex función necesito vertex_iterator (si he entendido bien cómo estas funciones de trabajo).

Por lo tanto, hay una manera fácil de transformar la adjacency_iterator en vertex_iterator? Si sigo el adjacency_iterator y se pasa a la clear_vertex la función, el problema es que no elimina los bordes (o eliminar de forma aleatoria a algunos vértices).

Mi mal código es:

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

Mejor respuesta

2

Depende del borde del contenedor de selectores.

La forma más fácil es cuando los contenedores están nodo, es decir, sólo los iteradores/descriptores para cualquier quitado los bordes quedan invalidados.

Otra forma es cuando se divide la "consulta" y "de" modificación de aspectos, por ejemplo,

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

Posible resultado:

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

En otros idiomas

Esta página está en otros idiomas

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