Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

หาจำนวนโหนดซิงค์ (Sink Nodes) ในกราฟด้วย C++

ในบทความนี้ เราจะอธิบายข้อมูลสำคัญในการแก้ปัญหาการหาจำนวนโหนดซิงค์ (sink nodes) ในกราฟ เรามีกราฟมีทิศทางไม่มีวัฏจักร (Directed Acyclic Graph) ที่มี N โหนด (1 ถึง N) และ M ขอบ (edges) ในโจทย์นี้ เป้าหมายคือการหาว่ามีโหนดซิงค์กี่โหนดในกราฟที่กำหนด โหนดซิงค์ (Sink Node) คือโหนดที่ไม่มีขอบออกไป (outgoing edges) ตัวอย่างง่ายๆ ดังนี้:

Input : n = 4, m = 2 Edges[] = {{2, 3}, {4, 3}} Output : 2

วิธีการแก้ปัญหาแบบง่าย

ในวิธีนี้ เราจะตรวจสอบขอบของกราฟ นำโหนดที่แตกต่างกันซึ่งมีขอบออกไป ใส่ในเซต (set) แล้วลบขนาดของเซตออกจากจำนวนโหนดทั้งหมดที่มีอยู่

ตัวอย่างโค้ด

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n = 4; // จำนวนโหนด
    int m = 2; // จำนวนขอบ
    vector<pair<int, int>> edges = {{2, 3}, {4, 3}}; // ขอบที่ไปจากตัวแรกถึงตัวสอง
    set<int> s;
    
    for(int i = 0; i < m; i++) {
        s.insert(edges[i].first); // เก็บค่าของโหนดที่แตกต่างกันซึ่งมีขอบออกไป
    }
    
    cout << n - s.size(); // คำตอบคือ จำนวนโหนดทั้งหมด - จำนวนโหนดที่ไม่ใช่ซิงค์
    return 0;
}

ผลลัพธ์

2

คำอธิบายโค้ด

ในโค้ดนี้ เราจะเดินทางผ่านเวกเตอร์ edges และนำสมาชิกแรกของคู่ (pair) ใส่เข้าไปในเซต เซตจะเก็บเฉพาะค่าที่แตกต่างกัน ดังนั้นตอนนี้เราจะลบขนาดของเซตออกจากจำนวนโหนดทั้งหมด โปรแกรมด้านบนมีความซับซ้อนด้านเวลา O(N) โดยที่ N ย่อมาจากจำนวนขอบที่มีอยู่ในกราฟ

สรุป

ในบทความนี้ เราแก้ปัญหาการหาจำนวนโหนดซิงค์ที่มีอยู่ในกราฟ ด้วยความซับซ้อนด้านเวลา O(N) โดยใช้เซต (set) ช่วยเหลือ เรายังเรียนรู้โปรแกรม C++ สำหรับปัญหานี้ และวิธีการแก้ปัญหาทั้งหมด สามารถเขียนโปรแกรมเดียวกันในภาษาอื่นๆ เช่น C, Java, Python ได้เช่นกัน หวังว่าบทความนี้จะเป็นประโยชน์