在Python中查找到达网络中消息所需的时间的程序

在Python中查找到达网络中消息所需的时间的程序

假设我们有一个数字和边的列表。这些n个不同的节点标记为0到N。这些节点形成一个网络。每个边以无向图的形式表示为(a,b,t),这表示如果我们尝试从a或b发送消息,则需要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()函数。这将采用边缘

  • 图:一个空map
  • 对于每个(src,dest,t)集合中的边缘,请执行以下操作
    • 在graph [src]中插入(dest,t)
    • 在graph [dest]中插入(src,t)
  • 返回图
  • 从主方法执行以下操作 –
  • 图:build_graph(edges)
  • 已访问:一个新的集合
  • 堆:使用对(0,0)进行新堆制作
  • while堆不为空,请执行以下操作
    • (current_total_time,node):堆的顶部元素,并从堆中删除它
    • 标记节点已访问
    • 如果访问的节点数与(n + 1)相同,则
      • 返回current_total_time
    • 对于图[node]中的每对(nei,time),请执行以下操作
      • 如果邻居没有访问过,则
      • 将pair(current_total_time + time,nei)插入堆中

更多Python相关文章,请阅读:Python 教程

示例(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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程