สมมติว่าเรามีรายการ 2 มิติของจำนวนเต็มที่เรียกว่า edge ซึ่งเป็นตัวแทนของกราฟที่ไม่มีทิศทาง ทุกแถวในอินพุตแสดงถึงขอบ [u, v, w] หมายถึงโหนด u และ v เชื่อมต่อกัน และขอบมีน้ำหนัก w กราฟประกอบด้วย n โหนดตั้งแต่ 0 ถึง n-1
ต้นทุนของเส้นทางถูกกำหนดไว้ที่นี่เป็นผลคูณของจำนวนขอบและน้ำหนักสูงสุดสำหรับขอบใดๆ ในเส้นทาง เราต้องหาต้นทุนขั้นต่ำที่เป็นไปได้จากโหนด 0 ถึงโหนด n-1 หรือประกาศคำตอบเป็น -1 หากไม่มีเส้นทางดังกล่าว
So, if the input is like edges = [ [0, 2, 100], [1, 2, 200], [1, 3, 100], [2, 3, 300] ], then the output will be 600
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กราฟ :=แผนที่ใหม่
-
น้ำหนัก :=แผนที่ใหม่
-
max_weight :=0
-
ไม่มี :=0
-
สำหรับแต่ละ u, v, w ในขอบ ทำ
-
แทรก v ที่ส่วนท้ายของกราฟ[u]
-
ใส่ u ที่ท้ายกราฟ[v]
-
น้ำหนัก[u, v] :=w
-
น้ำหนัก[v, u] :=w
-
N :=สูงสุดของ N, u + 1, v + 1
-
max_weight :=สูงสุดของ max_weight w
-
-
ผลลัพธ์ :=อนันต์
-
ในขณะที่ max_weight>=0 ทำ
-
d, น้ำหนัก :=bfs(0, max_weight)
-
ถ้า d>=0 แล้ว
-
ผลลัพธ์ :=ผลลัพธ์ขั้นต่ำ d * น้ำหนัก
-
max_weight :=น้ำหนัก - 1
-
-
มิฉะนั้น
-
ยุติการวนซ้ำ
-
-
-
ส่งคืนผลลัพธ์หากผลลัพธ์ <อินฟินิตี้เป็นอย่างอื่น -1
-
กำหนดฟังก์ชัน bfs() สิ่งนี้จะหยั่งราก weight_cap
-
เป้าหมาย :=N - 1
-
Q :=deque ที่มีรูท, 0, 0
-
เข้าชมแล้ว :=[เท็จ] * N
-
เข้าชมแล้ว[0] :=จริง
-
ในขณะที่ Q ไม่ว่างเปล่าให้ทำ
-
v, d, current_weight :=ลบองค์ประกอบสุดท้ายออกจาก Q
-
ถ้า v เหมือนกับ N - 1 แล้ว
-
ส่งคืน d, current_weight
-
-
สำหรับแต่ละ w ในกราฟ[v] ทำ
-
ถ้า visit[w] ไม่เป็นศูนย์ แล้ว
-
ดำเนินการซ้ำต่อไป
-
-
new_weight :=น้ำหนัก[v, w]
-
ถ้า new_weight <=weight_cap แล้ว
-
เยี่ยมชม[w] :=จริง
-
เพิ่ม (w, d + 1, สูงสุด (current_weight, new_weight)) ที่ด้านซ้ายของ Q
-
-
-
-
กลับ -1, -1
-
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
from collections import defaultdict, deque class Solution: def solve(self, edges): graph = defaultdict(list) weights = {} max_weight = 0 N = 0 for u, v, w in edges: graph[u].append(v) graph[v].append(u) weights[u, v] = w weights[v, u] = w N = max(N, u + 1, v + 1) max_weight = max(max_weight, w) def bfs(root, weight_cap): target = N - 1 Q = deque([(root, 0, 0)]) visited = [False] * N visited[0] = True while Q: v, d, current_weight = Q.pop() if v == N - 1: return d, current_weight for w in graph[v]: if visited[w]: continue new_weight = weights[v, w] if new_weight <= weight_cap: visited[w] = True zQ.appendleft((w, d + 1, max(current_weight, new_weight))) return -1, -1 result = float("inf") while max_weight >= 0: d, weight = bfs(0, max_weight) if d >= 0: result = min(result, d * weight) max_weight = weight - 1 else: break return result if result < float("inf") else -1 ob = Solution() print (ob.solve( [ [0, 2, 100], [1, 2, 200], [1, 3, 100], [2, 3, 300] ]))
อินพุต
[ [0, 2, 100], [1, 2, 200], [1, 3, 100], [2, 3, 300] ]
ผลลัพธ์
600