สมมติว่าเราต้องวางแผนเดินทางโดยรถยนต์ที่ต้องเยี่ยมชมเมืองต่างๆ จากประเทศต่างๆ เรามีรายการถนน R แต่ละสมาชิกเป็น (x, y, cost) โดย x คือเมืองต้นทาง y คือเมืองปลายทาง cost คือค่าใช้จ่าย เรายังมีรายการ C ที่แต่ละสมาชิกคือประเทศหนึ่ง ประกอบด้วยเมืองของประเทศนั้น กำหนดเมืองเริ่มต้น s และเมืองปลายทาง 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 -> 1 -> 3 ใช้ถนน [0, 1, 2] และ [1, 3, 3] การเดินทางข้ามประเทศ 2 ครั้ง ค่าใช้จ่ายรวม 2 + 3 = 5
ขั้นตอนการแก้ปัญหา
cont := แมปใหม่ค่าเริ่มต้น 0- สำหรับแต่ละดัชนี
idxและสมาชิกitemในC:- สำหรับแต่ละ
kในitemตั้งcont[k] := idx
- สำหรับแต่ละ
adj_list := แมปใหม่ที่มีค่าเป็นลิสต์- สำหรับแต่ละ
a, b, wtในR:- ถ้า
cont[a] != cont[b]ให้wt := wt + 10^10 - เพิ่มคู่
(b, wt)เข้าadj_list[a]
- ถ้า
distance := แมปใหม่ค่าเริ่มต้น 10^20,distance[s] := 0visited := เซตใหม่,t := heap ใหม่มีคู่ (0, s)- ในขณะที่
tไม่ว่าง:- นำคู่
(d, c)ที่น้อยที่สุดออกจาก heap - ถ้า
cอยู่ในvisitedข้ามรอบนี้ - เพิ่ม
cเข้าvisited - สำหรับแต่ละ
j, wtในadj_list[c]:- ถ้า
distance[j] > d + wtอัปเดตdistance[j]และเพิ่ม(d + wt, j)เข้า heap
- ถ้า
- นำคู่
- คืนค่า
(distance[e] // 10^10, distance[e] % 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)