เคลียร์เวอร์เท็กซ์ของเพื่อนบ้านของวี

0

คำถาม

ฉัน implementing เป็นอัลกอริธึมใน C++กับเพิ่มกราฟ.

ฉันอยากจะเจอตลอดเวอร์เท็กซ์อยู่ในละแวกบ้านของวี(ดังนั้นทั้งเพื่อนบ้าน)แล้วเปลี่ยนเป็นทรัพย์สินของพวกเขาและในที่สุดล้างทั้งหมดของพวกเขาขอบ.

ฉันเจอในเพิ่มฟังก์ชัน adjacent_vertices(v,g) นอยู่(v คือเวอร์เท็กซ์และจีนเป็นกราฟ)เพื่อค้นหาทั้งหมดเพื่อนบ้าน งั้นฉันต้องการจะปรับใช้ทั้งหมดของพวกเขาฟังก์ชัน clear_vertex(v,g) (อีกทีวีเป็นเวอร์เท็กซ์และจีนเป็นกราฟ)เพื่อลบออกทั้งหมดของพวกเขาขอบ.

ตอนนี้ผมมีปัญหา คน adjacent_vertices ฟังก์ชันจะได้เป็นคู่ adjacency_iteratorขณะที่เพื่ clear_vertex ฟังก์ชันฉันต้องการ vertex_iterator (ถ้าฉันเข้าใจไม่ผิดยังไงพวกนี้ฟังก์ชันที่ทำงาน).

งั้นก็มีทางง่ายๆทางนึงที่จะเปลี่ยนร่าง adjacency_iterator ใน vertex_iterator? ถ้าผมเก็บ adjacency_iterator และมองผ่านมันไป clear_vertex ฟังก์ชันปัญหาคือมันไม่ได้เอาขอบ(หรือลบพวกเขาแบบสุ่มบางอย่า vertices).

ฉัน ผิด กฎคือ:

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

คำตอบที่ดีที่สุด

2

มันขึ้นอยู่กับบตู้คอนเทนเนอร์ selectors.

ทางที่ง่ายที่สุดคือตอนที่ตู้บรรจุสินค้าเป็นโหนดหลัก i.e. เดียวที่ iterators/descriptors จะถูกลบออนเบนเป็ invalidated.

อีกทางคือตอนที่คุณแยกคน"กับการค้นหา"และ"แก้ไข"ๆ,e.g.

คอมไพเลอร์เอ็กซ์พลอเรอร์

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

เป็นไปได้แสดงผล:

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

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่