นี่คือวิธีการแก้ปัญหาตามความคิดในคำตอบของ Realz Slaw โดยพื้นฐานแล้วเป็นการแสดงออกถึงความคิดของเขาอีกครั้งซึ่งอาจชัดเจนหรือง่ายต่อการติดตาม แผนคือเราจะดำเนินการในสองขั้นตอน:
อันดับแรกเราจะสร้างกราฟมีคุณสมบัติต่อไปนี้: เส้นทางใด ๆ จากsถึงtในSคือเส้นทางที่สั้นที่สุดจากsถึงtในGและเส้นทางที่สั้นที่สุดจากsถึงtในGก็มีอยู่ในSด้วย ดังนั้นSประกอบด้วยเส้นทางที่สั้นที่สุดในG : เส้นทางที่สั้นที่สุดทั้งหมดและไม่มีอะไรเพิ่มเติม เมื่อมันเกิดขึ้นSจะเป็น DAGSstSstGstGSSGS
ต่อไปเราจะได้ลิ้มลองอย่างสม่ำเสมอโดยการสุ่มจากทุกเส้นทางจากไปทีในSstS
วิธีนี้ generalizes ไปโดยพลการกำกับกราฟตราบเท่าที่ขอบทั้งหมดมีน้ำหนักในเชิงบวกดังนั้นฉันจะอธิบายขั้นตอนวิธีของฉันในคำเหล่านั้น Let W ( U , V )หมายถึงน้ำหนักในขอบยู→วี (generalizes คำสั่งนี้ปัญหาที่คุณให้. ถ้าคุณมีกราฟไม่ได้ชั่งเพียงสมมติขอบทุกคนมีน้ำหนัก 1. ถ้าคุณมี undirected กราฟ, การรักษาขอบแต่ละไม่มีทิศทาง( U , V )ขณะที่ทั้งสองขอบกำกับยู→ V และV → คุณ )Gw(u,v)u→v(u,v)u→vv→u
ขั้นตอนที่ 1: สารสกัดจากSS เรียกใช้แหล่งเดียวอัลกอริทึมที่สั้นที่สุดเส้นทาง (เช่นอัลกอริทึมของ Dijkstra) บนเริ่มต้นจากแหล่งที่มาของ สำหรับแต่ละจุดสุดยอดวีในGให้d ( s , V )หมายถึงระยะทางจากsไปวีGsvGd(s,v)sv
ตอนนี้กำหนดกราฟดังนี้ มันประกอบด้วยขอบทุกU → วีดังกล่าวว่า (1) U → วีเป็นขอบในG , และ (2) d ( s , V ) = d ( s , U ) + W ( U , V )Su→vu→vGd(s,v)=d(s,u)+w(u,v)
กราฟมีคุณสมบัติที่สะดวก:S
เส้นทางที่สั้นที่สุดจากถึงtในGมีอยู่เป็นเส้นทางในS : เส้นทางที่สั้นที่สุดs = v 0 , v 1 , v 2 , … , v k = tในGมีคุณสมบัติที่d ( s , v i + 1 ) = d ( s , v i ) + w ( v i , v istGSs=v0,v1,v2,…,vk=tGเพื่อให้ขอบวีฉัน →วีฉัน+ 1อยู่ในSd(s,vi+1)=d(s,vi)+w(vi,vi+1)vi→vi+1S
ทุกเส้นทางในจากsไปทีเป็นเส้นทางที่สั้นที่สุดในG โดยเฉพาะอย่างยิ่งพิจารณาเส้นทางใด ๆ ในSจากsไปทีพูดs = v 0 , V 1 , V 2 , ... , วีk = T ความยาวของมันถูกกำหนดโดยผลรวมของน้ำหนักของขอบคือ∑ k i = 1 w ( v i - 1 , v i )SstGSsts=v0,v1,v2,…,vk=t∑ki=1w(vi−1,vi)แต่ตามนิยามของผลรวมนี้คือ∑ k i = 1 ( d ( s , v i ) - d ( s , v i - 1 ) , ซึ่งกล้องโทรทรรศน์ไปยังd ( s , t ) - d ( s , s ) = d ( s , t )ดังนั้นเส้นทางนี้เป็นเส้นทางที่สั้นที่สุดจากs ถึงtในGS∑ki=1(d(s,vi)−d(s,vi−1)d(s,t)−d(s,s)=d(s,t)stG.
ในที่สุดการไม่มีขอบน้ำหนักศูนย์ในบอกเป็นนัยว่าSคือเดกGS
ขั้นตอนที่ 2: ตัวอย่างเส้นทางสุ่ม ตอนนี้เราสามารถทิ้งน้ำหนักบนขอบในที่และตัวอย่างเส้นทางสุ่มจากsไปทีในSSstS
หากต้องการความช่วยเหลือเกี่ยวกับเรื่องนี้เราจะทำ precomputation การคำนวณสำหรับแต่ละจุดสุดยอดวีในSที่n ( วี)นับจำนวนของเส้นทางที่แตกต่างจากวีไปที การคำนวณล่วงหน้าสามารถทำได้ในเวลาเชิงเส้นโดยการสแกนจุดยอดของSในลำดับการเรียงทอพอโลยีโดยใช้ความสัมพันธ์การเกิดซ้ำดังต่อไปนี้:n(v)vSn(v)vtS
n(v)=∑w∈succ(v)n(w)
ที่หมายถึงผู้สืบทอดของโวลต์คือSucc ( V ) = { W : วี→ W เป็นขอบใน S }และที่เรามีกรณีฐานn ( T ) = 1succ(v)vsucc(v)={w:v→w is an edge in S}n(t)=1
ต่อไปเราจะใช้คำอธิบายประกอบเพื่อสุ่มเส้นทางแบบสุ่ม เราเข้ามาครั้งแรกโหนดs จากนั้นเราจะสุ่มเลือกหนึ่งในผู้สืบทอดของsกับทายาทWถ่วงน้ำหนักด้วยn ( W ) ในคำอื่น ๆ :n(⋅)sswn(w)
choosesuccessor(v):
n = 0
for each w in succ(w):
n = n + n(w)
r = a random integer between 0 and n-1
n = 0
for each w in succ(w):
n = n + n(w)
if r < n:
return w
ในการเลือกเส้นทางที่สุ่มเราซ้ำ ๆ ย้ำกระบวนการนี้คือและวีฉัน+ 1 = ( V ฉัน ) ส่งผลให้เส้นทางคือเส้นทางที่ต้องการและมันจะถูกเก็บตัวอย่างสม่ำเสมอโดยการสุ่มจากเส้นทางที่สั้นที่สุดจากทั้งหมดsไปทีv0=svi+1= choosesuccessor
(vi)st
หวังว่านี่จะช่วยให้คุณเข้าใจโซลูชันของ Realz Slaw ได้ง่ายขึ้น เครดิตทั้งหมดให้กับ Realz Slaw สำหรับวิธีการแก้ปัญหาที่สวยงามและสะอาดสำหรับปัญหานี้!
กรณีหนึ่งนี้ไม่ได้จัดการเป็นกรณีที่ขอบบางมีน้ำหนัก 0 หรือน้ำหนักลบ อย่างไรก็ตามปัญหาอาจไม่ได้รับการกำหนดอย่างชัดเจนในกรณีดังกล่าวเนื่องจากคุณสามารถมีเส้นทางที่สั้นที่สุดได้หลายเส้นทาง