สมมติว่าเรามีตัวเลข n และรายการเส้นเชื่อม edges มีโหนด 0 ถึง N สร้างเครือข่าย แต่ละเส้น (a, b, t) แสดงว่าส่งข้อความจาก a ไป b หรือ b ไป a ใช้เวลา t เมื่อโหนดรับข้อความ จะส่งต่อไปยังโหนดติดกันทันที ถ้าโหนดทั้งหมดเชื่อมต่อกัน หาเวลาที่ทุกโหนดรับข้อความที่เริ่มจากโหนด 0
เช่น n = 3, edges = [[0,1,3],[1,2,4],[2,3,2]] ผลลัพธ์ = 9 โหนดที่ 4 (หมายเลข 3) รับข้อความทาง 0→1→2→3 ใช้เวลา 3+4+2=9
ขั้นตอนการแก้ปัญหา (Dijkstra / Minimum Spanning Tree)
- สร้างกราฟจาก
edges:graph[src].add((dest, t))และgraph[dest].add((src, t)) visited := set(),heap := [(0, 0)](เวลา, โหนด)- while
heapไม่ว่าง:- ดึง
(current_total_time, node)จาก heap - mark
nodevisited - ถ้า
len(visited) == n+1คืนcurrent_total_time - วนเพื่อนบ้าน
(nei, time)ของnode:- ถ้า
neiยังไม่ visited: push(current_total_time + time, nei)เข้า heap
- ถ้า
- ดึง
ตัวอย่างโค้ด
import heapq
from collections import defaultdict
class Solution:
def solve(self, n, edges):
graph = self.build_graph(edges)
visited = set()
heap = [(0, 0)]
while heap:
current_total_time, node = heapq.heappop(heap)
visited.add(node)
if len(visited) == (n + 1):
return current_total_time
for nei, time in graph[node]:
if nei not in visited:
heapq.heappush(heap, (current_total_time + time, nei))
def build_graph(self, edges):
graph = defaultdict(set)
for src, dest, t in edges:
graph[src].add((dest, t))
graph[dest].add((src, t))
return graph
ob = Solution()
n = 3
edges = [[0, 1, 3], [1, 2, 4], [2, 3, 2]]
print(ob.solve(n, edges))
ข้อมูลนำเข้า
3, [[0, 1, 3],[1, 2, 4],[2, 3, 2]]
ผลลัพธ์
9