ผลต่างระหว่างรุ่นของ "418531 ภาคต้น 2552/โจทย์ปัญหาอัลกอริทึมเกี่ยวกับกราฟ/เฉลยข้อ 7"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
 
แถว 1: แถว 1:
 
== การ preprocess ==
 
== การ preprocess ==
ให้ทำ <math>\mathrm{DFSALL}(r) \,</math> (เรียก <math>\mathrm{DFSALL} \,</math> จาก root)
+
ให้ทำ <math>\mathrm{DFS}(r) \,</math> (เรียก <math>\mathrm{DFS} \,</math> จาก root)
  
 
ขั้นตอนนี้ใช้เวลา  <math>O(|V| + |E|) \,</math>
 
ขั้นตอนนี้ใช้เวลา  <math>O(|V| + |E|) \,</math>
แถว 20: แถว 20:
 
สมมติว่า <math>u \,</math> เป็นบรรพบุรุษของ <math>v \,</math> แล้ว path จาก <math>r \,</math> ไปยัง <math>v \,</math> จะต้องผ่าน <math>u \,</math>
 
สมมติว่า <math>u \,</math> เป็นบรรพบุรุษของ <math>v \,</math> แล้ว path จาก <math>r \,</math> ไปยัง <math>v \,</math> จะต้องผ่าน <math>u \,</math>
  
ฉะนั้นเมื่อทำ <math>\mathrm{DFSALL} \,</math> จาก <math>r \,</math> เราจะได้ว่า <math>u \,</math> จะถูกสำรวจก่อน <math>v \,</math>
+
ฉะนั้นเมื่อทำ <math>\mathrm{DFS} \,</math> จาก <math>r \,</math> เราจะได้ว่า <math>u \,</math> จะถูกสำรวจก่อน <math>v \,</math>
 
ฉะนั้น <math>\mathrm{pre}[u] < \mathrm{pre}[v] \,</math>
 
ฉะนั้น <math>\mathrm{pre}[u] < \mathrm{pre}[v] \,</math>
  
นอกจากนี้ เนื่องจากเราสามารถเดินจาก <math>u \,</math> ไปถึง <math>v \,</math> เราจะได้ว่า <math>v \,</math> จะต้องถูกสำรวจเสร็จก่อนที่ <math>\mathrm{DFSALL} \,</math> จะสำรวจ <math>u \,</math> เสร็จ กล่าวคือ <math>\mathrm{post}[v] < \mathrm{post}[u] \,</math>
+
นอกจากนี้ เนื่องจากเราสามารถเดินจาก <math>u \,</math> ไปถึง <math>v \,</math> เราจะได้ว่า <math>v \,</math> จะต้องถูกสำรวจเสร็จก่อนที่ <math>\mathrm{DFS} \,</math> จะสำรวจ <math>u \,</math> เสร็จ กล่าวคือ <math>\mathrm{post}[v] < \mathrm{post}[u] \,</math>
  
 
ฉะนั้นเราสรุปได้ว่า <math>\mathrm{pre}[u] < \mathrm{pre}[v] < \mathrm{post}[v] < \mathrm{post}[u] \,</math>
 
ฉะนั้นเราสรุปได้ว่า <math>\mathrm{pre}[u] < \mathrm{pre}[v] < \mathrm{post}[v] < \mathrm{post}[u] \,</math>

รุ่นแก้ไขปัจจุบันเมื่อ 13:48, 16 กันยายน 2552

การ preprocess

ให้ทำ (เรียก จาก root)

ขั้นตอนนี้ใช้เวลา

การตอบคำถามว่า เป็นบรรพบุรุษของ หรือไม่

กำหนด vertex และ สอง vertex ใดๆ ในต้นไม้ มาให้ เราสามารถตรวจสอบได้ว่า เป็นบรรพบุรุษของ ได้หรือไม่ดังต่อไปนี้

ตรวจสอบว่า หรือไม่

การตรวจสอบนี้ใช้เวลา

ที่เหลือคือเราต้องพิสูจน์ว่าการทดสอบนี้ถูกต้อง ซึ่งเท่ากับการพิูสูจน์ขอ้ความสองข้อความต่อไปนี้

  1. ถ้า เป็นบรรพบุรุษของ แล้ว
  2. ถ้า ไม่ใช่บรรพบุรุษของ แล้ว ข้อความ "" ไม่เป็นความจริง

ข้อความที่ 1

สมมติว่า เป็นบรรพบุรุษของ แล้ว path จาก ไปยัง จะต้องผ่าน

ฉะนั้นเมื่อทำ จาก เราจะได้ว่า จะถูกสำรวจก่อน ฉะนั้น

นอกจากนี้ เนื่องจากเราสามารถเดินจาก ไปถึง เราจะได้ว่า จะต้องถูกสำรวจเสร็จก่อนที่ จะสำรวจ เสร็จ กล่าวคือ

ฉะนั้นเราสรุปได้ว่า

ข้อความที่ 2

ข้อความที่ 2 สมมูลกับข้อความที่ว่า "ถ้า " แล้ว เป็นบรรพบุรุษของ

สมมติว่า เราได้ว่า เป็นบรรพบุรุษของ ใน DFS tree

แต่เนื่องจากกราฟตั้งต้น เป็นต้่นไม้อยู่แล้ว จึงเป็น DFS tree ด้วย ดังนั้น จึงเป็นบรรพบุรุษของ ใน