최대 1 분 소요

Problem

https://www.acmicpc.net/problem/1368

Idea

정점 간 간선의 길이가 주어지고 최소 비용으로 모든 정점을 연결하는 경로를 구하라는 것을 통해 최소 신장 트리에 관한 문제라는 것을 바로 알았다.

prim 알고리즘을 사용하여 최소 신장 트리를 구하되, 시작 정점을 우물을 파는데 가장 적은 비용이 드는 정점으로 설정하고 시작 정점을 제외한 모든 정점에 대해 자기 자신을 도착 정점으로 하며 비용이 우물 파는 비용인 간선을 초기 간선 집합에 넣어 주었다. prim 알고리즘을 통해 현재 신장 트리 집합에 트리 집합과 가장 가깝거나 우물 파는 비용이 가장 낮은 정점 중 더 작은 것을 추가하여 집합이 확장될 것이다.

Code

import sys
import heapq

def prim():
    selected = [False for _ in range(N)]
    sum = 0
    
    while heap:
        weight, vertex = heapq.heappop(heap)
        if selected[vertex] == False:
            selected[vertex] = True
            sum += weight
            
            for i, w in enumerate(edge[vertex]):
                if selected[i] == False:
                    heapq.heappush(heap, (w, i))
                    
        if False not in selected:
            break          
            
    print(sum)

input = sys.stdin.readline

N = int(input())
heap = []
for i in range(N):
    heapq.heappush(heap, (int(input()), i))

edge = [[] for _ in range(N)]
for i in range(N):
    Wi = list(map(int, input().split()))
    edge[i] = Wi

prim()

Comment

태그: ,

카테고리:

업데이트: