418531 ภาคต้น 2552/โจทย์ปัญหาการโปรแกรมพลวัต II/เฉลยข้อ 3

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา

อัลกอริทึมในการหา cycle ที่สั้นที่สุดมีดังต่อไปนี้

  1. รัน Floyd's algorithm บนกราฟ และสมมติให้ output ของมันอยู่ในอะเรย์
  2. สำหรับ edge แต่ละ edge ใน ให้คำนวณค่า โดยที่ คือความยาวของ edge แล้วจำค่า ที่ต่ำสุดเอาไว้
  3. ถ้าค่าที่ต่ำที่สุดในข้อ 2 เป็น ก็ให้ตอบว่าไม่มี cycle มิเช่นนั้นให้คืนมันเป็นคำตอบ

เราสามารถแสดงว่าคำตอบของอัลกอริทึมข้างบนคืนมาเป็นความยาวของ cycle ที่สั้นสุด ได้ดังต่อไปนี้

กรณีที่ 1: ถ้ากราฟไม่มี cycle เราจะได้ว่าสำหรับทุกๆ edge จะไม่มี path จาก ไปยัง ดังนั้น เสมอ ด้วยเหตุนี้ค่า

Error

Too many requests (f061ab2)

ที่ต่ำที่สุดจึงมีค่าเท่ากับ และอัลกอริทึมข้างบนจะตอบว่ากราฟไม่มี cycle ได้อย่างถูกต้อง

กรณีที่ 2 ถ้ากราฟมี cycle เราจะได้ว่ามี edge อย่างน้อยหนึ่ง edge ที่ทำให้ มีค่าน้อยกว่า เราจะต้องแสดงว่าค่า

Error

Too many requests (f061ab2)

ที่น้อยที่สุดคือความยาวของ cycle ที่สั้นที่สุด

อันดับแรก ให้พิจารณา edge ใดๆ เราได้ว่า คือความยาวของ shortest path จาก ไปยัง

Error

Too many requests (f061ab2)

ด้วยเหตุนี้ จึงเป็นความยาวของ cycle ที่สั้นที่สุดที่มี edge (เราสามารถแสดงว่าข้อความสุดท้ายนี้เป็นจริงได้โดยการสมมติให้เกิดข้อขัดแย้งว่า ไม่ใช่ความยาวของ cycle ที่สั้นที่สุดที่มี edge แต่เราจะได้ว่า cycle นั้นจะต้องมี path จาก ไปยัง และไม่มี path จาก v ไป u ที่มีความยาวน้อยกว่า แล้ว ทำให้เกิดข้อขัดแย้งขึ้น)

อันดับที่สอง เนื่องจาก cycle ที่สั้นที่สุดจะต้องผ่าน edge อย่างน้อย 1 edge เราจึงได้ว่าการนำความยาว cycle ที่สั้นที่สุดที่ผ่าน edge แต่ละ edge มาเปรียบเทียบกัน เพื่อหาความยาวที่น้อยที่สุดจะทำให้เราได้ความยาวของ cycle ที่สั้นที่สุดเสมอ

ด้วยเหตุนี้เราจึงสามารถสรุปได้ว่า ถ้ากราฟมี cycle แล้ว อัลกอริทึมข้างบนจะตอบความยาวของ cycle ที่สั้นที่สุดมาเสมอ

เราเห็นได้ชัดว่าการทำงานในขั้นตอนที่ 1 ของอัลกอริทึมข้างบนใช้เวลา

Error

Too many requests (f061ab2)

และการทำงานขั้นที่สองใช้เวลา ดังนั้นอัลกอริทึมข้างบนจึงทำงานได้ในเวลา

รายการเลือกการนำทาง