สมมุติว่าเราต้องวางแผนการเดินทางโดยต้องไปเยือนเมืองต่างๆ จากประเทศต่างๆ เรามีรายชื่อถนน 'R' ซึ่งแต่ละองค์ประกอบถูกอธิบายว่าเป็น (x, y, ราคา) x หมายถึงเมืองเริ่มต้นของถนน y หมายถึงเมืองปลายทางของถนน และราคาหมายถึงค่าใช้จ่ายในการเดินทางโดยถนนนั้น นอกจากนี้เรายังมีรายการ 'C' ซึ่งแต่ละองค์ประกอบเป็นประเทศ และองค์ประกอบหนึ่งประกอบด้วยเมืองของประเทศนั้น ๆ ตอนนี้ เรายังมี 'เมืองเริ่มต้น' และเมืองปลายทาง 'e' ด้วย และเราต้องการเดินทางไปยังเมืองปลายทางจากเมืองต้นทาง จากข้อมูลทั้งหมดนี้ เราต้องค้นหาจำนวนขั้นต่ำของการเดินทางระหว่างประเทศที่เราต้องทำเพื่อให้การเดินทางเสร็จสมบูรณ์และรวมถึงต้นทุนการเดินทางทั้งหมดสำหรับการเดินทางด้วย เราต้องพิมพ์ทั้งสองค่านี้เป็นผลลัพธ์
ดังนั้น หากอินพุตเป็น R =[[0, 1, 2],[1, 2, 2], [0, 2, 3], [1, 3, 3]], C =[[0], [1], [2, 3]], s =0, e =3 จากนั้นผลลัพธ์จะเป็น (2,5)
ดังนั้นหากต้องการเดินทางจาก 0 ถึง 3 เราใช้เส้นทาง 0->1->3 ถนนที่ใช้เส้นทางนี้คือ [0, 1, 2] และ [1, 3, 3] ดังนั้น รวมการเดินทางไปประเทศคือ 2 และค่าใช้จ่ายทั้งหมดคือ 2 + 3 =5.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- ต่อ :=แผนที่ใหม่โดยค่าเริ่มต้นคือ 0
- สำหรับ idx ดัชนีแต่ละรายการ และรายการองค์ประกอบใน C ให้ทำ
- สำหรับแต่ละ k ในรายการ ทำ
- ต่อ[k] :=idx
- สำหรับแต่ละ k ในรายการ ทำ
- adj_list :=แผนที่ใหม่ที่มีรายการเป็นค่า
- สำหรับแต่ละ a, b, wt ใน R, do
- ถ้า cont[a] ไม่เหมือนกับ cont[b] แล้ว
- wt :=wt + 10 ^ 10
- ใส่คู่ (b, wt) ที่ส่วนท้ายของ adj_list[a]
- ถ้า cont[a] ไม่เหมือนกับ cont[b] แล้ว
- ระยะทาง :=แผนที่ใหม่ที่ค่าเริ่มต้นคือ 10 ^ 20
- ระยะทาง[s] :=0
- เข้าชมแล้ว :=ชุดใหม่
- t :=ฮีปใหม่ที่มีคู่ (0, s)
- ในขณะที่ t ไม่ว่าง ให้ทำ
- คู่ (d, c) :=ป๊อปรายการที่เล็กที่สุดจากกอง
- ถ้ามี c อยู่ในการเยี่ยมชมแล้ว
- ติดตามตอนต่อไป
- เพิ่ม c เพื่อเข้าชม
- สำหรับแต่ละ j, wt ใน adj_list[c], do
- ถ้าระยะทาง[j]> d + wt แล้ว
- ระยะทาง[j] :=d + wt
- ใส่คู่ (d + wt, j) ไปที่ heap t
- ถ้าระยะทาง[j]> d + wt แล้ว
- ผลตอบแทนคู่ (ค่าพื้นของ (ระยะทาง[e] / 10 ^ 10), (ระยะทาง[e] mod 10 ^ 10))
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
from collections import defaultdict from heapq import heappush, heappop def solve(R, C, s, e): cont = defaultdict(int) for idx, item in enumerate(C): for k in item: cont[k] = idx adj_list = defaultdict(list) for a, b, wt in R: if cont[a] != cont[b]: wt += 10 ** 10 adj_list[a].append((b, wt)) distance = defaultdict(lambda: 10 ** 20) distance[s] = 0 visited = set() t = [(0, s)] while t: d, c = heappop(t) if c in visited: continue visited.add(c) for j, wt in adj_list[c]: if distance[j] > d + wt: distance[j] = d + wt heappush(t, (d + wt, j)) return distance[e] // 10 ** 10, distance[e] % 10 ** 10 print(solve([[0, 1, 2],[1, 2, 2],[0, 2, 3], [1, 3, 3]], [[0],[1],[2, 3]], 0, 3))
อินพุต
[[0, 1, 2],[1, 2, 2],[0, 2, 3], [1, 3, 3]], [[0],[1],[2, 3]], 0, 3
ผลลัพธ์
(2, 5)