Clar nod de toți vecinii de v

0

Problema

Voi implementa un algoritm in C++ cu accelerator Grafic.

Vreau să găsesc toate vertex în apropiere de v (deci, toți vecinii săi), apoi modificați o proprietate a lor și în cele din urmă clar toate marginile lor.

Am găsit în Impuls funcția adjacent_vertices(v,g) (unde v este nod, iar g este graf) pentru a găsi toți vecinii. Apoi vreau să aplice, pe toate le-funcția clear_vertex(v,g) (din nou, v este nod, iar g este graf) pentru a elimina toate marginile lor.

În acest moment, am o problema. La adjacent_vertices funcția returnează o pereche de adjacency_iterator, în timp ce pentru clear_vertex funcția trebuie vertex_iterator (dacă am înțeles corect modul în care aceste funcții de lucru).

Deci, există o modalitate ușoară de a transforma adjacency_iterator în vertex_iterator? Dacă țin adjacency_iterator și trece-l la clear_vertex funcția, problema este ca nu elimina marginile (sau a le elimina aleatoriu pentru unele noduri).

Meu greșit codul este:

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

Cel mai bun răspuns

2

Depinde pe marginea recipientului selectoare.

Cel mai simplu mod este atunci când containerele sunt node-uri, adică numai iteratori/descriptori pentru orice eliminat marginile sunt invalidate.

O altă modalitate este de când te-ai despărțit de "interogare" și "modificarea" aspecte, de exemplu

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

Posibil ieșire:

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

În alte limbi

Această pagină este în alte limbi

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