V'nin tüm komşularının köşesini temizle

0

Soru

Boost Graph ile C++ ' da bir algoritma uyguluyorum.

V mahallesindeki tüm köşeyi (yani tüm komşularını) bulmak, sonra onların bir özelliğini değiştirmek ve sonunda tüm kenarlarını temizlemek istiyorum.

Boost işlevinde buldum adjacent_vertices(v,g) (burada v tepe noktasıdır ve g grafiktir) tüm komşuları bulmak için. Sonra hepsine bu işlevi uygulamak istiyorum clear_vertex(v,g) (yine, v tepe noktasıdır ve g grafiktir) tüm kenarlarını kaldırmak için.

Bu noktada bir sorunum var. Bu adjacent_vertices işlev bir çift döndürür adjacency_iterator, süre için clear_vertex ihtiyacım olan işlev vertex_iterator (bu işlevlerin nasıl çalıştığını doğru anlarsam).

Yani, dönüştürmenin kolay bir yolu var adjacency_iterator içinde vertex_iterator? Eğer bende kalırsa adjacency_iterator ve pas clear_vertex ancak sorun, kenarları kaldırmaması (veya bazı köşelere rastgele kaldırmamasıdır).

Yanlış kodum:

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

En iyi cevabı

2

Kenar kabı seçicilerine bağlıdır.

En kolay yol, kapsayıcıların düğüm tabanlı olması, yani kaldırılan kenarlara yalnızca yineleyicilerin / tanımlayıcıların geçersiz kılınmasıdır.

Başka bir yol, "sorgu" ve "değişiklik" yönlerini böldüğünüz zamandır, örn.

Derleyici Gezgini

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

Olası çıktı:

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

Diğer dillerde

Bu sayfa diğer dillerde

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