본문 바로가기
Algorithm/Shortest Path

[leetcode] network delay time

by akatapata 2022. 1. 25.

network delay time

  • n개의 노드가 존재하는 네트워크 (1 ~ n)
  • times 는 (출발노드, 도착노드, 걸리는시간) 으로 구성된 리스트
  • k노드에서 출발해서 다른 모든 노드가 신호를 받는데 걸리는 최소시간 구하기
  • 1 <= len(times) <= 6000
  • 1 <= k <= n <= 100
  • (출발노드,도착노드,걸리는시간)에서 출발노드-도착노드 pair는 항상 unique

Solution

  • times 리스트를 graph로 나타내기(연결리스트로 표현)
  • 거리 테이블 초기화 INF 출발 노드만 0으로
  • 우선순위큐는 출발노드, 출발노드 까지의 거리=0 으로 초기화
  • 다익스트라 알고리즘으로 출발점에서의 최단거리 찾기
  • 최단 거리 테이블의 최대값 이 INF 이면 -1 반환 아니면 최대값 반환

Code

import heapq
from collections import defaultdict

class Solution(object):
    def networkDelayTime(self, times, n, k):

        INF = int(1e9)
        graph = defaultdict(list)

        for a, b, weight in times:
            graph[a].append((weight, b))

        dists = {i: INF for i in range(1, n + 1)}
        dists[k] = 0
        q = [(0, k)]

        while q:
            dist, v = heapq.heappop(q)
            if dist > dists[v]: continue
            for weight, w in graph[v]:
                if dists[w] > dist + weight:
                    dists[w] = dist + weight
                    heapq.heappush(q, (dists[w], w))

        result = max(dists.values())
        return result if result != INF else -1

Solution2

  • INF 값 정의하지 않고 구현
  • 최단거리가 결정된 노드만 dists에 삽입

Code2

import heapq
from collections import defaultdict

class Solution(object):
    def networkDelayTime(self, times, n, k):

        graph = defaultdict(list)
        dists = defaultdict(int)

        for a, b, weight in times:
            graph[a].append((weight, b))

        q = [(0, k)]

        while q:
            dist, v = heapq.heappop(q)
            if v not in dists:
                dists[v] = dist  
                for weight, w in graph[v]:
                    heapq.heappush(q, (dist + weight, w))

        return max(dists.values()) if len(dists)==n else -1

'Algorithm > Shortest Path' 카테고리의 다른 글

[leetcode] cheapest flights within k stops  (0) 2022.02.18