최소 스패닝 트리의 가중치 구하기.
입력 | 출력 |
---|---|
3 3 1 2 1 2 3 2 1 3 3 | 3 |
:
모든 그래프를 연결. 가중치 합이 최소가 되도록.
-> 크루스칼 알고리즘 이용.
- 가중치를 기준으로 오름차순하여 작은 가중치부터 선택
- 사이클을 이루는 지 확인(유니온 파인드 이용)
- 사이클을 이루지 않는다면 연결(루트노드를 같게)
- 가중치 더해줌
def find(v):
if v == root[v]: # 본인이 대장인경우
return v
else: # 본인이 대장이 아니면 재귀적으로 대장 찾음
y = find(root[v])
root[v] = y # v의 대장을 바로 제일 위 대장인 y로 바꿔줌
return y
def union(a, b):
a = find(a)
b = find(b)
if a>b : # 더 작은 수를 루트로 만든다.
root[a] = b
else :
root[b] = a
v, e = map(int, input().split())
graph = []
for _ in range(e):
s, e, w = map(int, input().split())
graph.append((w, s, e))
graph.sort(key=lambda x : x[0]) # 비용 기준 오름차순 정렬
root = [i for i in range(v+1)] #처음 각 원소의 대장은 자기 자신
sumi = 0 # 구해야할 최종 비용
for w, s, e in graph:
if find(s) != find(e): # 대장이 서로 다르면
union(s, e) # 트리 합해줌
sumi += w
print(sumi)