ค้นหาเส้นทางที่สั้นที่สุดในกราฟ unipathic ที่มีน้ำหนัก


12

กราฟกำกับกล่าวจะunipathicถ้าสองจุดและในกราฟมีที่มากที่สุดเส้นทางหนึ่งที่ง่ายจากจะวีuvG=(V,E)uv

สมมติว่าฉันได้รับกราฟ unipathicซึ่งขอบแต่ละด้านมีน้ำหนักเป็นบวกหรือลบ แต่ไม่มีวงจรน้ำหนักเชิงลบG

จากนี้ผมต้องการที่จะหาอัลกอริทึมที่พบทุกเส้นทางที่สั้นที่สุดเพื่อโหนดทั้งหมดจากแหล่งโหนดsO(|V|)s

ฉันไม่แน่ใจว่าฉันจะไปเกี่ยวกับปัญหานี้ได้อย่างไร ฉันพยายามที่จะดูว่าฉันสามารถใช้ความจริงที่ว่ามันไม่มีน้ำหนักรอบเชิงลบและแน่นอนที่เส้นทางที่ง่ายที่สุดระหว่างโหนดใด ๆไปวีuv


1
คุณลองทำอะไรไปแล้ว? หากคุณติดอยู่โดยสิ้นเชิงเริ่มเล็ก: กราฟ unipathic มีลักษณะเป็นอย่างไร ตัวอย่างเช่นวาดกราฟ unipathic ทุกอันด้วยหนึ่งจุดยอดสองจุดยอดสามจุดยอดและอื่น ๆ คุณอาจสังเกตเห็นรูปแบบที่เป็นประโยชน์ นอกจากนี้คุณพูดถึงไม่มีรอบน้ำหนักเชิงลบ - สามารถมีรอบ (น้ำหนักใด ๆ )?
Juho

@mrm คุณคิดแบบไหน กราฟ Unipathic สามารถมีรอบในลักษณะที่ จำกัด ที่ฉันไม่สามารถหาวิธีที่ง่ายในการแสดง
Gilles 'SO- หยุดความชั่วร้าย'

@mrm ไม่ได้ขอบสามารถอยู่ได้ไม่เกินหนึ่งรอบ โหนดสามารถอยู่ในจำนวนรอบใด ๆ : กราฟที่มีรูปดาวจุดเป็น unipathic (และคุณสามารถ รับอัตราส่วนที่สูงขึ้นของรอบประถมศึกษาต่อโหนด) nE=in{(a,bi),(bi,a)}
Gilles 'SO- หยุดความชั่วร้าย'

คำตอบ:


10

เลือกการแสดงข้อมูล

ก่อนอื่นดูขนาดของผลลัพธ์ คุณต้องการรวบรวมเส้นทางที่สั้นที่สุดจากไปยังโหนดอื่นทุกโหนด เว้นแต่ความยาวเฉลี่ยของเส้นทางถูกล้อมรอบด้วยค่าคงที่ (ซึ่งไม่ใช่: รายการใด ๆ ที่เป็น unipath และถ้าคุณหาค่ารากสำหรับความยาวทั้งหมดของเส้นทางคือโดยที่คือ ความยาวของรายการ) คุณจะต้องระมัดระวังในการแสดงข้อมูลของคุณ: โครงสร้างที่มีเส้นทางจะต้องใช้การแชร์ระหว่างเส้นทางssn(n1)/2n

ไม่รวมรอบมีเส้นทางเดียวจากไปยังโหนดอื่น ๆยูถ้าเส้นทางที่จะไปผ่านกลางโหนดแล้วส่วนแรกของเส้นทางเป็นเส้นทางที่ต้องการจากไปที sutst

ผมเสนอให้จัดเก็บผลในอาร์เรย์จัดทำดัชนีโดยโหนดจำนวนจากไปกับ 0 แต่ละองค์ประกอบในอาร์เรย์เก็บดัชนีของโหนดก่อนหน้านี้บนเส้นทางไปยังโหนดนั้น (ใช้เช่นเป็นเครื่องหมายพิเศษสำหรับโหนดที่ไม่สามารถเข้าถึงได้จาก ) เส้นทางจากเพื่อจะt)0|E|1s=01sst(s=R[R[t]],,R[R[t]],R[t],t)

สำรวจกราฟ

เตรียมทุก-1R1

ดำเนินการครั้งแรกลึกหรือกว้างแรกสำรวจเส้นทางของกราฟเริ่มต้นจากsทุกครั้งที่ถึงโหนดให้ตั้งค่าเป็นบรรพบุรุษของมันsuR[u]

เนื่องจากมีรอบจึงอาจถึงโหนดมากกว่าหนึ่งครั้ง การมีระบุว่าได้เยี่ยมชมแล้วR[u]1u

พิสูจน์ความถูกต้อง

เนื่องจากคุณสมบัติ unipathic จึงไม่สำคัญว่าเราจะไปถึงแต่ละโหนดได้อย่างไรตราบใดที่เรายังไม่ครบรอบ มีเพียงเส้นทางเดียวเท่านั้น

พิสูจน์ความซับซ้อน

อัลกอริทึมอาจถึงแต่ละโหนดมากกว่าหนึ่งครั้งจึงไม่ชัดเจนว่าความซับซ้อนของมันคือ|) งานที่ทำอยู่ในความเป็นจริงโดยที่เป็นขอบที่สามารถเข้าถึงได้จากแหล่งที่มา แม่นยำมากขึ้นเราไปถึงโหนดมากกว่าหนึ่งครั้งในกรณีเดียวเท่านั้น: ถ้าโหนดเป็นครั้งแรกที่เราไปถึงในรอบหนึ่ง ๆ และในกรณีนี้เราไปถึงสองครั้ง (จากเส้นทางที่เรียบง่ายและอีกครั้งหลังจากเสร็จสิ้นรอบ )O(|V|)Θ(|E0|)V0

ดีละถ้าอย่างนั้น. เรามาพิสูจน์กันแล้วว่าในกราฟ unipathic จำนวนรอบประถมศึกษาจะเพิ่มขึ้นเป็นเส้นตรงตามจำนวนโหนด (วัฏจักรพื้นฐานคือวงจรที่ไม่มีวงจรที่สั้นกว่า) ในการสนทนาต่อไปนี้ฉันจะสมมติว่ากราฟไม่มีขอบตัวเอง (ไม่มีขอบจากโหนดถึงตัวมันเองขอบนั้นไม่เกี่ยวข้องกับการสร้างเส้นทางเลย )

กราฟ Unipathic สามารถมีรอบ แต่ในทางที่ จำกัด มาก มันจะดีถ้าเราสามารถเชื่อมโยงแต่ละรอบกับโหนดที่แตกต่างกัน (หรืออย่างน้อยที่สุดก็คือจำนวนรอบต่อโหนดที่ จำกัด ) รอบสามารถแบ่งปันโหนดหรือไม่ น่าเสียดายใช่

คุณสามารถมีรอบทั้งหมดที่ใช้ร่วมกันหนึ่งโหนดและไม่มีโหนดอื่น กราฟผลลัพธ์คือ unipathic ที่มีรอบของความยาว 2 นี้เป็นรูปแบบดาวแห่งนี้มีโหนดศูนย์กลางและจำนวนของโหนดใด ๆดังกล่าวว่าb_imaabii,abi

ดังนั้นเราจะต้องทำงานให้หนักขึ้น ทีนี้เราลองพิสูจน์ว่ามันเหนี่ยวนำ ให้เป็นจำนวนโหนดในกราฟ ,จำนวนขอบและจำนวนรอบประถมที่ไม่ใช่ขอบตัวเอง ผมยืนยันว่าถ้าเป็น unipathic และไม่ว่างแล้ว\#V(G)G#E(G)#C(G)G#C(G)#V(G)1

สำหรับกราฟที่มีหนึ่งหรือสองโหนดจะเห็นได้ชัด สมมติว่าการยืนยันถือกราฟทั้งหมดที่และปล่อยให้เป็นกราฟ unipathic ที่มีโหนดถ้าไม่มีรอบ, , เคสปิด มิฉะนั้นให้เป็นวัฏจักรเบื้องต้น#V(G)<nGnG0=#C(G)<#V(G)(a1,,am)

ยุบรอบ: ให้เป็นกราฟที่มีโหนดเป็นลบบวกโหนดและมีขอบเป็นขอบทั้งหมดของไม่เกี่ยวข้องกับบวกเมื่อใดก็ตามที่และเมื่อใดก็ตามที่Ä_i ทุกเส้นทางในทำให้เกิดเส้นทางใน (ถ้าเส้นทางเกี่ยวข้องกับดังนั้นแทนที่ด้วยGG{a1,,am}aGaiaGbi,aiGbbGai,bGaiGGbacbaiai+1ajcใน ) ดังนั้นจึงเป็น unipathic นอกจากนี้ตั้งแต่รอบในไม่ขอบหุ้นมีวงจรทั้งหมดในยกเว้นสำหรับคนที่เราตัดออก:\ โดยการเหนี่ยวนำ 1 ตั้งแต่เรามีn-1GGGGG#C(G)=#C(G)1#C(G)#V(G)1#V(G)=#V(G)m+1#C(G)=#C(G)+1#V(G)m=nmn1

นี่เป็นการสรุปหลักฐาน การเคลื่อนที่ผ่านตามขอบมากที่สุด2|V|2

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