ยาก 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

Strongly Connected Components

นับกลุ่มของโหนดที่ทุกโหนดสามารถเข้าถึงกันและกันได้ทั้งหมด

ในกราฟแบบมีทิศทางที่มีโหนด 0..n−1, strongly connected component คือกลุ่มโหนดที่ใหญ่ที่สุดที่ทุกโหนดในกลุ่มสามารถเข้าถึงกันและกันได้ทั้งหมด จงนับจำนวน component (ใช้ Kosaraju's หรือ Tarjan's algorithm ก็ได้)

ให้เขียนฟังก์ชัน count_scc(n, edges)

อินพุต

n: จำนวนโหนด edges: รายการขอบแบบมีทิศทางในรูปแบบ [from, to]

เอาต์พุต

คืนค่าจำนวน component

เงื่อนไข

1 ≤ n ≤ 100,000; 0 ≤ edges ≤ 200,000

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
n = 5
edges = [
    [0, 1],
    [1, 2],
    [2, 0],
    [3, 4]
]

ผลลัพธ์ที่คาดหวัง:
expected = 3
อินพุต:
long long n = 5;
std::vector<std::vector<long long>> edges = {
    {0, 1},
    {1, 2},
    {2, 0},
    {3, 4}
};

ผลลัพธ์ที่คาดหวัง:
long long expected = 3;
อินพุต:
long n = 5;
long[][] edges = new long[][] {
    new long[] {0, 1},
    new long[] {1, 2},
    new long[] {2, 0},
    new long[] {3, 4}
};

ผลลัพธ์ที่คาดหวัง:
long expected = 3;

คำอธิบาย

โหนด 0, 1, 2 สร้างวงจร (เป็น 1 component); โหนด 3 และ 4 ไม่สามารถเข้าถึงกันและกันได้ จึงเป็นคนละกลุ่ม: 3.

ตัวอย่างที่ 2
อินพุต:
n = 3
edges = [
    [0, 1],
    [1, 0],
    [1, 2],
    [2, 1]
]

ผลลัพธ์ที่คาดหวัง:
expected = 1
อินพุต:
long long n = 3;
std::vector<std::vector<long long>> edges = {
    {0, 1},
    {1, 0},
    {1, 2},
    {2, 1}
};

ผลลัพธ์ที่คาดหวัง:
long long expected = 1;
อินพุต:
long n = 3;
long[][] edges = new long[][] {
    new long[] {0, 1},
    new long[] {1, 0},
    new long[] {1, 2},
    new long[] {2, 1}
};

ผลลัพธ์ที่คาดหวัง:
long expected = 1;

คำอธิบาย

ทั้งสามโหนดสามารถเข้าถึงกันและกันได้ทั้งหมด: 1.

แหล่งอ้างอิง

โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก