ผลต่างระหว่างรุ่นของ "418531 ภาคต้น 2552/โจทย์ปัญหาการโปรแกรมพลวัต II/เฉลยข้อ 1"
(หน้าที่ถูกสร้างด้วย 'สังเกตว่าในกราฟนี้ทุก edge มีความยาวเป็น 1 ดังนั้นเร…') |
Cardcaptor (คุย | มีส่วนร่วม) |
||
แถว 24: | แถว 24: | ||
# สร้างอะเรย์ <math>M \,</math> ให้มีขนาดใหญ่เท่ากับจำนวน vertex ในกราฟ และเซตให้ <math>M[w] = 0 \,</math> สำหรับ vertex <math>w \,</math> ทุกๆ vertex | # สร้างอะเรย์ <math>M \,</math> ให้มีขนาดใหญ่เท่ากับจำนวน vertex ในกราฟ และเซตให้ <math>M[w] = 0 \,</math> สำหรับ vertex <math>w \,</math> ทุกๆ vertex | ||
# ไล่ vertex <math>x \,</math> ทีละเวอร์เท็กซ์ โดยไล่จากค่า <math>L[x] \,</math> น้อยไปยังค่า <math>L[x] \,</math> มาก | # ไล่ vertex <math>x \,</math> ทีละเวอร์เท็กซ์ โดยไล่จากค่า <math>L[x] \,</math> น้อยไปยังค่า <math>L[x] \,</math> มาก | ||
− | # | + | #: พิจารณา edge <math>(x,w) \,</math> ที่ออกจาก <math>x \,</math> ทุก edge |
− | # | + | #:: ถ้า <math>L[w] = L[x]+1 \,</math> แล้ว เซตให้ <math>M[w] = M[w] + M[x] \,</math> |
เมื่ออัลกอริทึมทำงานเสร็จ เราจึงสามารถคืน <math>M[v] \,</math> เป็นคำตอบได้ | เมื่ออัลกอริทึมทำงานเสร็จ เราจึงสามารถคืน <math>M[v] \,</math> เป็นคำตอบได้ | ||
− | + | อัลกอริทึมข้างบนทำงานโดยใช้เวลา <math>O(|V| + |E|) \,</math> เนื่องจาก breadth first search ทำงานได้ในเวลา <math>O(|V|+|E|) \,</math> และ loop ในข้อ 3 ก็ทำงานในเวลา <math>O(|V|+|E|) \,</math> เช่นกันเนื่องจากมันเข้าถึง edge แต่ละ edge เพียงครั้งเดียวเท่านั้น |
รุ่นแก้ไขปัจจุบันเมื่อ 14:50, 4 ตุลาคม 2552
สังเกตว่าในกราฟนี้ทุก edge มีความยาวเป็น 1 ดังนั้นเราจึงาสามารถหา shortest path จาก u ไป v ได้ด้วย breadth first search (BFS)
ในการแก้ปัญหาในโจทย์ เราจะพยายามแก้ปัญหาที่เป็นแนวทั่วไปมากขึ้น กล่าวคือเราจะไม่หาจำนวน shortest path ที่แตกต่างกันจาก ไปยัง เท่านั้น แต่เราจะทำการหาคำนวณอะเรย์ โดยที่ มีค่าเท่ากับจำนวน shortest path จาก ไปยัง เมื่อ เป็น vertex ใดๆ ในกราฟ
อันดับแรก สังเกตว่า เนื่องจาก shortest path จาก ไปยัง มีอยู่ path เดียวคือ path ความยาว 0 ที่เริ่มที่ แล้วไม่เคลื่อนต่อไปไหน
ต่อไป ให้ เป็น vertex ใดๆ ในกราฟ สมมติว่า shortest path จาก ไปยัง มีความยาว edge เราจะได้ว่า
- (*)
เมื่อ คือ vertex ทั้งหมดที่
- ความยาวของ shortest path จาก ไปยัง มีค่าเท่ากับ และ
- มี edge อยู่ในกราฟ สำหรับทุกๆ
ที่เป็นเช่นนี้เพราะว่าสำหรับ path ความยาว จาก ไปถึง ทุก path จะมี vertex สุดท้ายก่อนจะไปถึง สมมติให้ vertex สุดท้ายนั้นเป็น เราจะได้ว่า
- ความยาวของ shortest path จาก ไปยัง จะต้องเป็น
(ัอันดับแรก ความยาวของ shortest path จาก ไปยัง จะมีค่ามากที่สุดเท่ากับ เนื่องจาก path จาก ไปถึง ก่อนที่จะไป มีความยาว อยู่แล้ว อันดับที่สอง shortest path จาก ไปถึง จะสั้นกว่า ไม่ได้ เนื่องจากถ้ามันสั้นกว่านั้นความยาวของ shortest path จาก ไปถึง ก็จะสั้นลงด้วย)
ด้วยเหตุนี้ สำหรับ shortest path จาก ไปถึง หนึ่ง path จะทำให้เกิด shortest path จาก ไปถึง หนึ่ง path ด้วย (กล่าวคือเราเดินจาก ไปถึง แล้วเดินต่อจาก ไปยัง โดยผ่าน edge ) สมการ (*) จีงเป็นความจริง
จากสมการ (*) เราจึงสามารถคำนวณอะเรย์ ได้ดังต่อไปนี้
- รัน breadth first search บนกราฟโดยเริ่มจาก แล้วให้แต่ละ vertex แต่ละ vertex จำระดับของมัน (ซึ่งมีค่าเท่ากับความยาวของ shortest path จาก ถึง ) ไว้ในอะเรย์
- สร้างอะเรย์ ให้มีขนาดใหญ่เท่ากับจำนวน vertex ในกราฟ และเซตให้ สำหรับ vertex ทุกๆ vertex
- ไล่ vertex ทีละเวอร์เท็กซ์ โดยไล่จากค่า น้อยไปยังค่า มาก
- พิจารณา edge ที่ออกจาก ทุก edge
- ถ้า แล้ว เซตให้
- พิจารณา edge ที่ออกจาก ทุก edge
เมื่ออัลกอริทึมทำงานเสร็จ เราจึงสามารถคืน เป็นคำตอบได้
อัลกอริทึมข้างบนทำงานโดยใช้เวลา เนื่องจาก breadth first search ทำงานได้ในเวลา และ loop ในข้อ 3 ก็ทำงานในเวลา เช่นกันเนื่องจากมันเข้าถึง edge แต่ละ edge เพียงครั้งเดียวเท่านั้น