Leetcode - 图(二)

 

743. 网络延迟时间

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。

题解

一:典型的带权图的最短单源路径问题,用迪杰特斯拉(Dijkstra算法)

from heapq import heappop, heappush
class Solution(object):
    def networkDelayTime(self, times, N, K):
        """
        :type times: List[List[int]]
        :type N: int
        :type K: int
        :rtype: int
        """
        G = [{} for _ in range(N + 1)]

        for v, w, time in times:
            G[v][w] = time 

        visited = [False] * (N + 1)
        dis = [float("inf")] * (N + 1)
        pq = []
        heappush(pq, (0, K))
        dis[K] = 0 
        res = 0

        while pq:
            # 找出未确定最短路径的最小值对应的顶点
            time, cur = heappop(pq)
            if visited[cur]:
                continue
            # 确定该顶点,用visited对应位标True
            visited[cur] = True
            res = max(res, time)
            # 以该点出发,寻找其邻边,若通过该点达到比之前小的值,入队并更新距离
            for w in G[cur]:
                new_time = dis[cur] + G[cur][w]
                if not visited[w] and new_time < dis[w]:
                    dis[w] = new_time 
                    heappush(pq, (new_time, w))
        
        for i in range(1, N + 1):
            if not visited[i]:
                return -1 
        return res

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值