แหล่งอ้างอิง: https://cses.fi/book/book.pdf
Graph เป็นโครงสร้างข้อมูลที่ใช้แทนความสัมพันธ์ระหว่างสิ่งต่าง ๆ
MST จะทำงานกับ Weighted Graph
MST คือ Tree ที่สร้างจาก Graph
Graph หนึ่งอันสามารถมี หลาย Spanning Trees
เป้าหมายของ MST คือ "เชื่อมทุกโหนดด้วยต้นทุนต่ำที่สุด"
Spanning Tree คือ Tree ที่เชื่อมทุก Vertex ใน Graph โดยไม่มี cycle
Graph นี้มีหลายวิธีในการเลือก edges เพื่อสร้าง Spanning Tree
Weight = 4 + 2 + 3 = 9
Weight = 4 + 2 + 5 = 11
เลือก edges:
Total Weight = 9
การลองทุก Spanning Tree เป็นไปไม่ได้สำหรับ Graph ขนาดใหญ่
เราจึงใช้ Greedy Algorithms
ต่อไปเราจะเริ่มจาก Kruskal Algorithm
Kruskal ใช้แนวคิด Greedy Algorithm
Greedy คือการเลือกตัวเลือกที่ดีที่สุดในแต่ละขั้น
โดยหวังว่าจะได้ผลลัพธ์ที่ดีที่สุดในภาพรวม
Edges:
(A,C,2) (C,D,3) (A,B,4) (B,D,5)
(A,C) = 2
(C,D) = 3
(A,B) = 4
(B,D) = 5
เราจะเลือก edge จากบนลงล่าง
Step 1: เลือก (A,C) weight = 2
Step 2: เลือก (C,D) weight = 3
Step 3: เลือก (A,B) weight = 4
ตอนนี้มี edges = 3 = V-1
ได้ Minimum Spanning Tree แล้ว
เมื่อเพิ่ม edge เราต้องตรวจสอบว่า
จะเกิด cycle หรือไม่
ใช้ DSU เพื่อป้องกันการสร้าง cycle
Prim Algorithm เป็นอีกวิธีหนึ่งในการหา
Minimum Spanning Tree
แนวคิดหลัก:
เริ่มจาก node หนึ่ง
แล้วค่อย ๆ เพิ่ม edge ที่มีน้ำหนักน้อยที่สุด
เพื่อขยาย tree ทีละ node
ผลลัพธ์คือ Minimum Spanning Tree
เริ่มต้นที่ Vertex A
Start at A
Edges from A:
(A,C) = 2
(A,B) = 4
เลือก (A,C)
Tree: A → C
Current Tree: A, C
Candidate edges:
(A,B) = 4
(C,D) = 3
เลือก (C,D)
Tree: A → C → D
สุดท้ายเพิ่ม (A,B)
MST Complete
Prim ใช้ Priority Queue เพื่อเลือก edge ที่เล็กที่สุด
Topological Sort ใช้กับ
Directed Graph
Edge มีทิศทาง เช่น A → B
Topological Sort ใช้ได้เฉพาะกับ
Directed Acyclic Graph
Directed → มีทิศทาง
Acyclic → ไม่มี cycle
Topological Order หนึ่งแบบคือ
A → C → B → D
ทุก edge ต้องชี้ไปข้างหน้า
A : indegree = 0
B : indegree = 1
C : indegree = 1
D : indegree = 2
เริ่มจาก node ที่ indegree = 0
1️⃣ หา node ที่ indegree = 0
2️⃣ ใส่ node ลงใน queue
3️⃣ ลบ node ออกจาก graph
4️⃣ ลด indegree ของ neighbor
5️⃣ ถ้า indegree = 0 ให้ใส่ queue
6️⃣ ทำจนกว่า queue จะว่าง
Start: A (indegree = 0)
Result: A
Remove A → update indegree
B , C → indegree = 0
Queue = [B , C]
Result: A → B → C → D
ใช้ Queue + Indegree
Greedy
Sort edges
Use DSU
Greedy
Grow MST
Priority Queue
Directed Graph
DAG only
Use indegree
ต่อไปเราจะฝึกเขียนโปรแกรม