더북(TheBook)

코드 14-3

    def dijkstra(self, s):
        distance = [self.BIG_NUMBER for _ in range(self.vertex_num)] 
        p = [None for _ in range(self.vertex_num)] 

        S = set() 
        pq = MinPriorityQueue()
        for i in range(self.vertex_num):
            pq.push((self.BIG_NUMBER, i))

        distance[s] = 0
        pq.push((0, s))

        while len(S) < self.vertex_num:
            d, v = pq.pop()
            if distance[v] != d:
                continue

            S.add(v)

            adj_v = self.adjacent_set(v)
            for u, w_u_v in adj_v:
                if u not in S and distance[u] > distance[v]+w_u_v:
                    distance[u] = distance[v] + w_u_v
                    p[u] = v
                    pq.push((distance[u], u))

        sp = ShortestPath(s, distance, p)
        return sp

    def adjacent_set(self, v):
        adj_v = []
        for i in range(self.vertex_num):
            w = self.adj_matrix[v][i]
            if w:
                adj_v.append((i, w))
        return adj_v

출발 정점에서 S에 있는 정점만 거쳐 v에 도달하는 경로 길이

predecessor distance[v]를 구할 때 경로상에서 v의 바로 이전 노드

최단 경로가 발견된 정점 집합

push((distance, v))

relaxation 이전 요소는 무시합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.