743.网络延迟时间
链接:743.网络延迟时间
难度:Medium
标签:深度优先搜索、广度优先搜索、图、最短路、堆(优先队列)
简介:现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。
题解 1 - typescript
- 编辑时间:2021-08-02
- 执行用时:108ms
- 内存消耗:45.8MB
- 编程语言:typescript
- 解法介绍:哈希储存,每次删减。
class NetNode {
  next: [NetNode, number][] = [];
  constructor(public val: number) {}
}
function getMap(times: number[][]): Map<number, NetNode> {
  const map = new Map<number, NetNode>();
  for (const [start, end, time] of times) {
    let startNode = map.get(start);
    if (!startNode) map.set(start, (startNode = new NetNode(start)));
    let endNode = map.get(end);
    if (!endNode) map.set(end, (endNode = new NetNode(end)));
    startNode.next.push([endNode, time]);
  }
  return map;
}
function networkDelayTime(times: number[][], n: number, k: number): number {
  const map = getMap(times);
  const init = map.get(k)!;
  const q: [NetNode, number][] = [[init, 0]];
  const set = new Set<NetNode>();
  let ans = -1;
  while (q.length) {
    const nextQ: [NetNode, number][] = [];
    let f = false;
    while (q.length) {
      const info = q.shift()!;
      if (set.has(info[0])) continue;
      f = true;
      if (info[1] === 0) {
        set.add(info[0]);
        for (const [next, time] of info[0].next) {
          if (time !== 0) set.has(next) || nextQ.push([next, time - 1]);
          else q.push([next, time]);
        }
      } else {
        info[1]--;
        nextQ.push(info);
      }
    }
    q.push(...nextQ);
    if (f) ans++;
  }
  return set.size === n ? ans : -1;
}
题解 2 - python
- 编辑时间:2024-11-25
- 执行用时:6ms
- 内存消耗:18.07MB
- 编程语言:python
- 解法介绍:bfs。
class Solution:
    def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:
        nodes = [[] for _ in range(n + 1)]
        for t in times: nodes[t[0]].append(t)
        q = [(0, k)]
        used = { k: 0 }
        used2 = set([k])
        while q:
            t, node = heappop(q)
            used2.add(node)
            if len(used2) == n: return t
            for time in nodes[node]:
                _, child, time_offset = time
                next_time = time_offset + t
                if child not in used or next_time < used[child]:
                    used[child] = next_time
                    heappush(q, (next_time, child))
        return -1