กราฟมีต้นไม้สองสามครั้งที่แตกต่างกันเล็กน้อย?


15

ฉันกำลังพยายามหาวิธีที่มีประสิทธิภาพในการตรวจสอบว่ากราฟที่ระบุ G มีต้นไม้ทอดข้ามน้อยที่สุดสองแบบหรือไม่ ฉันกำลังพยายามหาวิธีในการตรวจสอบว่ามีต้นไม้ที่ขยายเล็ก ๆ น้อย ๆ 3 แบบหรือไม่ โซลูชันไร้เดียงสาที่ฉันคิดว่ากำลังเรียกใช้อัลกอริทึมของ Kruskal เพียงครั้งเดียวและค้นหาน้ำหนักรวมของต้นไม้ที่ทอดน้อยที่สุด จากนั้นนำขอบออกจากกราฟและเรียกใช้อัลกอริทึมของ Kruskal อีกครั้งและตรวจสอบว่าน้ำหนักของต้นไม้ใหม่นั้นเป็นน้ำหนักของต้นไม้ที่ขยายเล็กสุดดั้งเดิมหรือไม่และสำหรับแต่ละขอบของกราฟ รันไทม์คือ O (| V || E | log | V |) ซึ่งไม่ดีเลยและฉันคิดว่ามีวิธีที่ดีกว่าที่จะทำ

ข้อเสนอแนะใด ๆ ที่จะเป็นประโยชน์ขอบคุณล่วงหน้า


มันคงจะดีถ้าได้รู้อัลกอริธึมดังกล่าว แต่จะไม่สามารถแก้ปัญหาปัจจุบันได้
itamar

2
กราฟจะมีต้นไม้ทอดขั้นต่ำที่ไม่ซ้ำกันเฉพาะในกรณีที่ (1) สำหรับพาร์ติชันเป็นสองชุดย่อยขอบน้ำหนักขั้นต่ำที่มีจุดปลายหนึ่งจุดในแต่ละชุดย่อยจะไม่ซ้ำกันและ (2) น้ำหนักสูงสุด ขอบในวงจรของใด ๆ ที่ไม่ซ้ำกัน V ( G ) GGV(G)G
Juho

ทำคำถามเหล่านี้หนึ่งและสองตอบคำถามของคุณแล้ว?
Juho

เห็นปัญหา 23-1 ใน CLRS สำหรับวิธีการหา MST สองที่ดีที่สุดใน2) O(n2)
Kaveh

คำตอบ:


7

Kapoor และราเมษ ( ที่เหมาะสมสยามเจคอมพิว. รุ่น , ฟรี (?) รุ่นเว็บไซต์ส่วนตัว ) ให้อัลกอริทึมสำหรับแจงขั้นต่ำทุกต้นไม้ทอดทั้งในกราฟถ่วงน้ำหนักและชั่ง

ความเข้าใจของฉันเกี่ยวกับแนวคิดพื้นฐานคือคุณเริ่มต้นด้วย MST หนึ่งจากนั้นสลับขอบที่อยู่ตามรอบในกราฟ (ตราบใดที่น้ำหนักไม่เป็นไรคุณกำลังแทนที่ขอบหนึ่งด้วยอีกอันที่คุณรู้ว่าจะเชื่อมต่อต้นไม้) .

สำหรับกรณีที่มีน้ำหนักพวกเขาให้เวลาทำงานในการแสดงรายการแผนผังสแปนนิ่งขั้นต่ำทั้งหมดของโดยที่คือจำนวนของสแปนทรีดังกล่าว มันแจกแจงพวกมันตามลำดับของน้ำหนักที่เพิ่มขึ้นและความเข้าใจในปัจจุบันของฉัน (คร่าวๆ) แสดงให้เห็นว่ามันเป็นไปได้อย่างสมบูรณ์แบบที่จะยุติอัลกอริทึมหลังจากที่มันสร้างจำนวนต้นไม้ที่กำหนดNO(N|V|)N


ในสถานการณ์นี้ที่นี่เราต้องการยกเลิกอัลกอริทึมก่อนเมื่อเรารู้ว่ามีวิธีแก้ปัญหามากกว่าอัลกอริทึมนี้อนุญาตหรือไม่ k
Raphael

1
@ ราฟาเอลฉันไม่ได้มีเวลาที่จะได้รับมันจริงๆ (yay มอบหมายการทำเครื่องหมาย) แต่จากความเข้าใจที่หยาบคายของฉันมันควรจะเป็นไปได้ - มันเริ่มต้นด้วย MST บางส่วนจากนั้นสร้างคนอื่นทีละคนจากมัน
Luke Mathieson

1
@SaeedAmiri: "จำนวนของเช่นต้นไม้ทอด" หมายถึง "จำนวนขั้นต่ำต้นไม้ทอด" ไม่ "จำนวนของต้นไม้ทอด" หากต้นไม้ที่ขยายทั้งหมดเป็นต้นไม้ที่ขยายน้อยที่สุดกราฟป้อนข้อมูลจะเสร็จสมบูรณ์และขอบทั้งหมดมีน้ำหนักเท่ากัน nn2
JeffE

1
กระดาษจะพิจารณาทั้งกราฟที่มีน้ำหนักและไม่มีน้ำหนักดังนั้นคุณจึงถูกต้อง;) ผมยังคิดว่าขั้นตอนวิธีการช่วยให้ความเป็นไปได้ของการหยุดหลังจากที่คุณได้สร้างขึ้นจำนวนของต้นไม้ที่คุณต้องการเพื่อให้สำหรับ OP นี้จะใช้เวลามันลงไป ) อีกครั้งฉันต้องการเวลาว่างเพื่อให้ดูดีขึ้น O(|V|)
Luke Mathieson

1
หลังจากอ่านอย่างรวดเร็วอัลกอริธึมถ่วงน้ำหนักจะสร้างต้นไม้เพื่อเพิ่มน้ำหนัก (เริ่มต้นจาก MST อย่างเห็นได้ชัด) ดังนั้นจึงควรทำตามวัตถุประสงค์ของ OP
Luke Mathieson

2

เราสามารถแสดงให้เห็นได้ว่าอัลกอริธึมของ Kruskal สามารถค้นหาต้นไม้ที่ครอบคลุมได้น้อยที่สุด ดูที่นี่

kk


5
kkK1,5

@ vonbrand จุดดี เราสามารถดำเนินการคำนวณให้เสร็จสิ้นทุกสาขา แต่จากนั้นรันไทม์จะถูกกำหนดโดยจำนวนของสแปนทรีซึ่งอาจอธิบายได้
Raphael

1

หากต้องการดูว่ามี MST มากกว่าหนึ่งหรือไม่ให้พิจารณาเช่นอัลกอริทึมของ Kruskal วิธีเดียวที่จะสามารถสร้าง MSTs ที่แตกต่างกันคือการออกจากขอบโดยเลือกอีกอันหนึ่งเมื่อมีหลายแบบที่มีน้ำหนักเท่ากัน แต่ขอบที่มีน้ำหนักเท่ากันนั้นอาจถูกตัดออกเพราะเกิดวงจรที่มีขอบที่เบากว่า ...

ดังนั้นคุณควรรันอัลกอริทึมของ Kruskal และเมื่อมีหลายขอบที่มีน้ำหนักเท่ากันที่ต้องพิจารณาให้เพิ่มทั้งหมดของมันที่สามารถเพิ่มได้โดยไม่ต้องสร้างรอบ หากมีขอบของน้ำหนักนี้เหลืออยู่และไม่ได้ปิดรอบด้วยขอบใด ๆ ที่มีน้ำหนักต่ำกว่า (ซึ่งเพิ่มก่อนหน้านี้) แสดงว่ามี MST มากกว่าหนึ่ง ตรวจสอบว่ามี 2 หรือ 3 หรือมากกว่านั้น ฯลฯ ดูยากกว่านี้ ...


0

อัลกอริธึมของ Kruskal Modidying: ในขณะที่สั่งซื้อขอบขอบคลัสเตอร์ที่มีน้ำหนักเท่ากัน ตอนนี้ถึงจุดที่คุณดำเนินการกับขอบตามลำดับทุกครั้งที่คุณไปถึงกลุ่มใหม่ให้ตรวจสอบทุก ๆ ส่วนของขอบแยกจากกันและนำออกจากกลุ่มที่จะปิดวงจรจากสิ่งที่สร้างขึ้นก่อนหน้าคลัสเตอร์ จากนั้นรันขอบที่เหลือทั้งหมดในคลัสเตอร์ตอนนี้พยายามที่จะเพิ่มลงใน MST หากหนึ่งในนั้นปิดวงจรนั่นเป็นเพราะขอบอื่น ๆ ของคลัสเตอร์เดียวกันที่แทรกไว้ก่อนหน้าซึ่งหมายความว่าคุณมี MST มากกว่าหนึ่ง

โซลูชันดังกล่าวรักษาความซับซ้อนของอัลกอริทึมของ Kruskal เพียงเพิ่มเวลาสำหรับการประมวลผลขอบแต่ละครั้ง


ดูเหมือนว่าคุณจะอ้างว่าคุณสามารถประมวลผลทั้งคลัสเตอร์ในเวลาคงที่ แต่ฉันไม่เห็นค่าคงที่ที่ชัดเจนที่ถูกผูกไว้กับขนาดของคลัสเตอร์ คุณช่วยให้รายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำเวทีนั้น?
David Richerby
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.