LeetCode 743 网络延迟问题

19 篇文章 0 订阅
6 篇文章 0 订阅

有 N 个网络节点,标记为 1 到 N。

给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。

现在,我们从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。

注意本题的w可以取到0,因此图初始化时节点值得大小不能为0,可以设为-1。

采用Dij算法解决

from typing import *
import sys


class Solution:
    def networkDelayTime(self, times: List[List[int]], N: int, K: int) -> int:
        graph = [[-1] * (N + 1) for _ in range(N + 1)]
        for time in times:
            graph[time[0]][time[1]] = time[2]
        max_dist = max(self.Dij(graph, K, N))
        return max_dist if max_dist < sys.maxsize else -1

    def Dij(self, graph, start, N):
        visited = [False] * (N + 1)
        dist = [sys.maxsize] * (N + 1)
        dist[start] = 0
        for _ in range(N):
            min_val = sys.maxsize
            index = -1
            for i in range(1, N + 1):
                if not visited[i] and dist[i] < min_val:
                    min_val = dist[i]
                    index = i
            if -1 == index:
                break
            visited[index] = True
            for i in range(1, N + 1):
                if not visited[i] and graph[index][i] != -1:
                    if dist[i] > (dist[index] + graph[index][i]):
                        dist[i] = dist[index] + graph[index][i]
        return dist[1:]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值