LC 743图论中等第 95 / 95 题

网络延迟时间

Network Delay Time

Dijkstra最短路优先队列
本机进度仅保存在当前浏览器

题目描述

有 n 个网络节点,标记为 1 到 n。给你一个列表 times,表示信号经过有向边的传递时间 times[i] = (ui, vi, wi),该信号从节点 ui 经边传到 vi 需要 wi 时间。现在从某个节点 k 发出一个信号,需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。

示例:times = [[2,1,1],[2,3,1],[3,4,1]],n = 4,k = 2,输出 2。

解题思路

  1. 单源最短路模板题(边权非负),标准解法是堆优化 Dijkstra,答案为源点到各点最短距离的最大值。
  2. 维护「已确定最短距离」与「未确定」两个集合:每次从优先队列取出距离最小的节点,它不可能再被更短路径更新,将其定案。
  3. 松弛:取出节点时若队列中记录的距离大于 dist 表,说明是过期条目,直接跳过;对邻居做 dist 更新并入堆。
  4. 复杂度 O(E log V);存在不可达节点时 dist 保持无穷,返回 -1。

参考实现

查看参考实现Python · 建议先自行作答
import heapq
from collections import defaultdict

def networkDelayTime(times, n, k):
    graph = defaultdict(list)
    for u, v, w in times:
        graph[u].append((v, w))
    dist = {}
    heap = [(0, k)]  # (距离, 节点)
    while heap:
        d, node = heapq.heappop(heap)
        if node in dist:
            continue  # 过期条目跳过
        dist[node] = d
        for nxt, w in graph[node]:
            if nxt not in dist:
                heapq.heappush(heap, (d + w, nxt))
    return max(dist.values()) if len(dist) == n else -1

复杂度与归属

时间复杂度O(E log V)
空间复杂度O(V + E)
所属分类图论
题源LeetCode 743

关联教程

返回题图鉴