ค้นหาเส้นทางที่ยาวที่สุดจากรูทถึงใบไม้ในต้นไม้


15

ฉันมีต้นไม้ (ในความหมายทฤษฎีกราฟ) เช่นตัวอย่างต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

นี่เป็นต้นไม้กำกับที่มีโหนดเริ่มต้นหนึ่งโหนด (รูท) และโหนดสิ้นสุด (ใบ) ขอบแต่ละอันมีความยาวที่กำหนด

คำถามของฉันคือจะหาเส้นทางที่ยาวที่สุดที่เริ่มต้นที่รากและสิ้นสุดที่ใบใด? วิธีการบังคับเดรัจฉานคือการตรวจสอบเส้นทางรูตทั้งหมดและหาทางที่มีความยาวสูงสุด แต่ฉันต้องการอัลกอริทึมที่มีประสิทธิภาพมากขึ้นถ้ามี


คำถามที่เกี่ยวข้อง
กราฟิลส์

คำตอบ:


16

Ran G. ให้คำแนะนำเกี่ยวกับอัลกอริทึมที่มีประสิทธิภาพแม้ว่าบางทีเขาอาจจะทิ้งรายละเอียดไว้บ้าง การคำนวณเส้นทางรูตทั้งหมดจะไม่มีประสิทธิภาพเล็กน้อยหากคุณทำงานซ้ำแล้วซ้ำอีกตัวอย่างเช่นหากคุณคำนวณแต่ละเส้นทางแล้วคำนวณความยาว

ดำเนินการขั้นตอนวิธีแบบเรียกซ้ำต่อไปนี้เริ่มต้นด้วยLongestPath(root)จะให้สิ่งที่คุณต้องการ โดยพื้นฐานแล้วมันจะคำนวณเส้นทางที่ยาวที่สุดสำหรับแต่ละทรีย่อย ที่แต่ละโหนดต้องสร้างเส้นทางใหม่และคืนค่าที่ยาวที่สุด

 LongestPath(node)
   If node is a leaf, return (node,0) 
   If node is not a leaf:  
    For each edge (node,length,next):
       Let (p,l) = LongestPath(next)
       Let (path,len) = (p++[next], l + length)
    Return element (path,len) from previous step with largest value len

นี่คือการรวมกันหากรหัสหลอกด้วยสัญกรณ์ Haskell บางอย่างดังนั้นฉันหวังว่ามันจะเข้าใจได้

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