Python程序:查找网络中消息到达所需时间
假设我们有一个数字和一个边的列表。这些 n 个不同的节点标记为 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 的时间。
为了解决这个问题,我们将遵循以下步骤:
定义一个函数 build_graph()。这将接收边作为输入。
- graph := 一个空映射
- 对于 edges 中的每个 (src, dest, t) 集合,执行以下操作:
- 将 (dest, t) 插入到 graph[src] 中
- 将 (src, t) 插入到 graph[dest] 中
- 返回 graph
- 从主方法执行以下操作:
- graph := build_graph(edges)
- visited := 一个新的集合
- heap := 创建一个新的堆,包含 (0, 0) 对
- 当堆不为空时,执行以下操作:
- (current_total_time, node) := 堆的顶部元素,并将其从堆中删除
- 标记节点为已访问
- 如果已访问节点的数量与 (n + 1) 相同,则
- 返回 current_total_time
- 对于 graph[node] 中的每个 (nei, time) 对,执行以下操作:
- 如果 nei 未被访问,则
- 将 (current_total_time + time, nei) 对插入到堆中
- 如果 nei 未被访问,则
示例(Python)
让我们看看以下实现以更好地理解:
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
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP