การค้นหาเส้นทางที่สั้นและยาวที่สุดระหว่างจุดยอดสองจุดใน DAG


14

ให้ DAG ที่ไม่มีน้ำหนัก (กำกับด้วยกราฟ acyclic)และสองจุดยอดและเป็นไปได้ไหมที่จะหาเส้นทางที่สั้นและยาวที่สุดจากถึงในเวลาพหุนาม ความยาวเส้นทางวัดจากจำนวนขอบD=(V,A)stst

ฉันสนใจที่จะหาช่วงของความยาวเส้นทางที่เป็นไปได้ในเวลาพหุนาม

Ps. คำถามนี้เป็นซ้ำของ StackOverflow คำถามเส้นทางที่ยาวที่สุดใน DAG

คำตอบ:


10

สำหรับปัญหาเส้นทางที่สั้นที่สุดหากเราไม่สนใจเรื่องน้ำหนักการค้นหาที่กว้างครั้งแรกนั้นเป็นวิธีที่แน่นอน มิฉะนั้นอัลกอริทึมของ Dijkstra จะทำงานตราบใดที่ไม่มีขอบลบ

สำหรับเส้นทางที่ยาวที่สุดคุณสามารถทำBellman-Fordบนกราฟได้ด้วยน้ำหนักที่ไม่ได้รับผลกระทบทั้งหมด โปรดจำไว้ว่า Bellman-Ford ทำงานได้ตราบใดที่ไม่มีรอบน้ำหนักเชิงลบและดังนั้นจึงทำงานได้กับน้ำหนักใด ๆ บน DAG


2
Bellman-Ford เป็นอัลกอริทึมการเขียนโปรแกรมแบบไดนามิก
Raphael

1
@ ราฟาเอลใช่ แต่ฉันคิดว่ามีอัลกอริธึม DP โดยตรงเพื่อหาเส้นทางสูงสุดแทนที่จะลบล้างน้ำหนักขอบทั้งหมด
jmite

1
@jmite: ทำไมแน่นอน: เพียงแค่เปลี่ยน Bellman-Ford เพื่อทำการแปลงออนไลน์หรือเพิ่มหรือ ...
Raphael

1
โดยวิธีการที่ฉันไม่เชื่อมั่นอย่างสังหรณ์ใจว่าปัญหา NP- สมบูรณ์เส้นทางที่ยาวที่สุดจึงง่ายใน P ใน DAGs ฉันขอขอบคุณหลักฐาน / การอ้างอิง / คำอธิบาย
กราฟิลส์

2
นอกจากนี้ยังมีอัลกอริทึม DP ที่ง่ายและมีประสิทธิภาพสำหรับDAG

8

ให้และ. Letแสดงว่าน้ำหนักของขอบเพื่อข) สมมติว่าคุณต้องการที่จะหาค่าใช้จ่ายต่ำสุดและสูงสุดเส้นทางจากไปทีm = | E ( G ) | w ( a b ) ( a b ) s tn=|V(G)|m=|E(G)|w(ab)(ab)st

เริ่มต้นจากดำเนินการดังต่อไปนี้:b:=t

  1. หากได้รับการเยี่ยมชมแล้วกลับมาคำนวณแล้วและ(ข) มิฉะนั้นทำเครื่องหมายว่าเยี่ยมชมbmin(b)max(b)b

  2. กำหนดและบันทึกและดังนี้min(b)max(b)

    • หากร้าน0b=smin(s):=max(s):=0
    • ชุดอื่นละเว้นจุดยอดที่{} เมื่อคำนวณต่ำสุดและสูงสุดกว่าชุดที่ว่างเปล่าของขอบ (ไม่มีขอบขาเข้าที่ทั้งหมดหรือทั้งหมดละเว้น) ชุด{}
      min(b):=minab[w(ab)+min(a)]max(b):=maxab[w(ab)+max(a)]
      min(a)=max(a)=inaccessiblebmin(b):=max(b):=inaccessible

คุณควรจะสามารถพิสูจน์ได้ว่าอัลกอริทึมนี้ทำงานในเวลาโดยละเลยเวลาที่ต้องเริ่มต้นตัวแปรจุดสุดยอดทั้งหมดO(m)


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