최소 스패닝 트리 : 크루스칼
최소 신장 트리 :
=> 사이클이 형성되지 않는 간선끼리 이어서 최소 비용 트리
import sys
def find(x) :
if x!=parent[x] :
parent[x] = find(parent[x])
return parent[x]
def union(a,b) :
a = find(parent[a])
b = find(parent[b])
if a<=b :
parent[b] = a
else :
parent[a] = b
answer = 0
# 모든 도시에 전기를 공급할 수 있도록 케이블을 설치하는 데 드는 최소비용
arr = []
# 도시의 개수 N(1 ≤ N ≤ 1,000)과 설치 가능한 케이블의 수 M(1 ≤ M ≤ 100,000)개, 발전소의 개수 K
N,M,K = map(int,sys.stdin.readline().rstrip().split())
parent = [i for i in range(N+1)]
# 발전소인 도시의 부모를 통일
elec_list = list(map(int,sys.stdin.readline().rstrip().split()))
for elec in elec_list :
parent[elec] = 0
for i in range(M) :
# u 도시에서 v 도시로 가는 케이블
u,v,cost = map(int,sys.stdin.readline().rstrip().split())
arr.append((u,v,cost))
# 케이블 비용 기준으로 오름차순
# 케이블 설치 비용을 최소로 사용하여 모든 도시에 전기가 공급할 수 있도록 해결해야 한다.
cable_list = sorted(arr, key = lambda x : x[2])
for cable in cable_list :
u,v,cost = cable
if find(u)!=find(v) :
union(u,v)
answer+=cost
print(answer)
최소 스패닝 트리 : 크루스칼
최소 신장 트리 :
arr = sorted(arr,key=lambda x:x[2])