【LeetCode】743.网络延迟时间 (Python) 和 Dijkstra算法

题目地址:https://leetcode-cn.com/problems/network-delay-time/

题目描述:

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

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

现在,我们向当前的节点 K 发送了一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。

注意:

N 的范围在 [1, 100] 之间。
K 的范围在 [1, N] 之间。
times 的长度在 [1, 6000] 之间。
所有的边 times[i] = (u, v, w) 都有 1 <= u, v <= N 且 0 <= w <= 100。

class Solution:
    def networkDelayTime(self, times: List[List[int]], N: int, K: int) -> int:
        g = {} # 构造图
        for u, v, w in times:
            g[u] = g.get(u, {})
            g[u][v] = w
        
        if K not in g:
            return -1
        
        # K到所有结点的初始距离
        dists = [g[K].get(i, float('inf')) for i in range(1, N + 1)]
        # 还未得到最短距离的所有结点,即除自身外的所有结点
        points = list(range(1, K)) + list(range(K + 1, N + 1))
        while points:
            # 得到距离中的最小值和它的结点标识以及它在points里的index
            minimum, _idx, _point = float('inf'), 0, 0
            for idx, point in enumerate(points):
                if dists[point-1] < minimum:
                    minimum, _idx, _point = dists[point-1], idx, point
                    
            points.pop(_idx) # O(1)时间移除该结点,remove是O(n)
            if _point in g:
                for v, w in g[_point].items():
                    if dists[v - 1] > w + minimum: # 以_point作为跳板可以更快到达v
                        dists[v - 1] = w + minimum
                        
        dists.pop(K-1) # 删除自己
        time = max(dists)
        if time == float('inf'):
            return -1
        return time

题目是求有权最短路径问题,对于权值都是正数的问题可以使用Dijkstra算法,算法详见:https://blog.csdn.net/qq_35644234/article/details/60870719

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值