DAA - Spanning Tree

spanning tree เป็นส่วนย่อยของกราฟที่ไม่มีทิศทางที่มีจุดยอดทั้งหมดเชื่อมต่อกันด้วยจำนวนขอบขั้นต่ำ

หากจุดยอดทั้งหมดเชื่อมต่อกันในกราฟแสดงว่ามีต้นไม้ทอดอยู่อย่างน้อยหนึ่งต้น ในกราฟอาจมีต้นไม้ที่ทอดมากกว่าหนึ่งต้น

คุณสมบัติ

  • ต้นไม้ที่ทอดไม่มีวัฏจักรใด ๆ
  • จุดยอดใด ๆ สามารถเข้าถึงได้จากจุดยอดอื่น ๆ

ตัวอย่าง

ในกราฟต่อไปนี้ขอบที่ไฮไลต์จะกลายเป็นต้นไม้ที่ทอดยาว

ต้นไม้ระยะขั้นต่ำ

Minimum Spanning Tree (MST)คือส่วนย่อยของขอบของกราฟที่ไม่ได้กำหนดทิศทางแบบถ่วงน้ำหนักที่เชื่อมต่อซึ่งเชื่อมต่อจุดยอดทั้งหมดพร้อมกับน้ำหนักขอบรวมขั้นต่ำที่เป็นไปได้ ในการรับ MST สามารถใช้อัลกอริทึมของ Prim หรืออัลกอริทึมของ Kruskal ได้ ดังนั้นเราจะพูดถึงอัลกอริทึมของ Prim ในบทนี้

ดังที่เราได้กล่าวไปแล้วกราฟหนึ่งเส้นอาจมีต้นไม้ทอดมากกว่าหนึ่งต้น ถ้ามีn จำนวนจุดยอดต้นไม้ที่ทอดควรมี n - 1จำนวนขอบ ในบริบทนี้หากแต่ละขอบของกราฟมีความสัมพันธ์กับน้ำหนักและมีต้นไม้ทอดมากกว่าหนึ่งอันเราจำเป็นต้องหาต้นไม้ที่มีระยะทอดต่ำสุดของกราฟ

ยิ่งไปกว่านั้นหากมีขอบถ่วงน้ำหนักที่ซ้ำกันกราฟอาจมีต้นไม้ที่มีระยะการทอดขั้นต่ำหลายอัน

ในกราฟด้านบนเราได้แสดงต้นไม้ที่ทอดแล้วแม้ว่าจะไม่ใช่ต้นไม้ที่มีระยะทอดขั้นต่ำ ต้นทุนของต้นไม้ที่ทอดนี้คือ (5 + 7 + 3 + 3 + 5 + 8 + 3 + 4) = 38

เราจะใช้อัลกอริทึมของ Prim เพื่อค้นหาต้นไม้ที่มีการขยายน้อยที่สุด

อัลกอริทึมของ Prim

อัลกอริทึมของ Prim เป็นวิธีการที่ละโมบในการค้นหาต้นไม้ที่มีระยะทอดน้อยที่สุด ในอัลกอริทึมนี้เพื่อสร้าง MST เราสามารถเริ่มต้นจากจุดยอดโดยพลการ

Algorithm: MST-Prim’s (G, w, r) 
for each u є G.V 
   u.key = ∞ 
   u.∏ = NIL 
r.key = 0 
Q = G.V 
while Q ≠ Ф 
   u = Extract-Min (Q) 
   for each v є G.adj[u] 
      if each v є Q and w(u, v) < v.key 
         v.∏ = u 
         v.key = w(u, v)

ฟังก์ชัน Extract-Min จะส่งกลับจุดยอดพร้อมต้นทุนขอบขั้นต่ำ ฟังก์ชันนี้ทำงานบน min-heap

ตัวอย่าง

การใช้อัลกอริทึมของ Prim เราสามารถเริ่มต้นจากจุดยอดใดก็ได้ให้เราเริ่มจากจุดยอด 1.

จุดยอด 3 เชื่อมต่อกับจุดยอด 1 ด้วยต้นทุนขอบขั้นต่ำจึงได้เปรียบ (1, 2) จะถูกเพิ่มไปยังต้นไม้ที่ทอดยาว

ถัดไปขอบ (2, 3) ถือว่าเป็นขั้นต่ำของขอบ {(1, 2), (2, 3), (3, 4), (3, 7)}.

ในขั้นตอนต่อไปเราจะได้เปรียบ (3, 4) และ (2, 4)ด้วยต้นทุนขั้นต่ำ ขอบ(3, 4) ถูกเลือกแบบสุ่ม

ในทำนองเดียวกันขอบ (4, 5), (5, 7), (7, 8), (6, 8) และ (6, 9)ถูกเลือก เมื่อมีการเยี่ยมชมจุดยอดทั้งหมดตอนนี้อัลกอริทึมจะหยุดลง

ต้นทุนของต้นไม้ทอดคือ (2 + 2 + 3 + 2 + 5 + 2 + 3 + 4) = 23 ไม่มีต้นไม้ทอดอีกต่อไปในกราฟนี้ที่มีต้นทุนน้อยกว่า 23.