본문 바로가기

알고리즘 문제풀이

정복자(백준 14950)

 

  프림 알고리즘을 이용해서 도시들을 모두 이어준 다음에 나중에 추가 비용을 더하면 된다. 

크루스칼 알고리즘을 이용해도 된다. 

 

14950번: 정복자

서강 나라는 N개의 도시와 M개의 도로로 이루어졌다. 모든 도시의 쌍에는 그 도시를 연결하는 도로로 구성된 경로가 있다. 각 도로는 양방향 도로이며, 각 도로는 사용하는데 필요한 비용이 존재

www.acmicpc.net

import sys
import heapq
input = sys.stdin.readline 
n,m,t = map(int, input().split())
visit = [0 for i in range(n+1)]
gra = [[] for i in range(n+1)]
ans = 0 

def prim(start):
    global ans 
    q = [[0,start]]
    flag = 0 
    heapq.heapify(q)
    while q:
        cost, now= heapq.heappop(q)
        flag += 1 
        if visit[now]==0 :
            visit[now] = 1 
            ans+= cost 
            for nextnode, nextcost in gra[now] :
                if visit[nextnode] ==0 :
                    heapq.heappush(q, (nextcost ,nextnode))
plus = (n-1)*(n-2)//2 

for i in range(m):
    a,b,c= map(int, input().split())
    gra[a].append((b,c))
    gra[b].append((a,c))

prim(1)
ans += plus*t 
print(ans)