그래프가 주어졌을 때, 그 그래프의 최소 스패닝 트리를 구하는 프로그램을 작성하시오.
최소 스패닝 트리는, 주어진 그래프의 모든 정점들을 연결하는 부분 그래프 중에서 그 가중치의 합이 최소인 트리를 말한다.
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이 가중치 C인 간선으로 연결되어 있다는 의미이다. C는 음수일 수도 있으며, 절댓값이 1,000,000을 넘지 않는다.
그래프의 정점은 1번부터 V번까지 번호가 매겨져 있고, 임의의 두 정점 사이에 경로가 있다. 최소 스패닝 트리의 가중치가 -2,147,483,648보다 크거나 같고, 2,147,483,647보다 작거나 같은 데이터만 입력으로 주어진다.
첫째 줄에 최소 스패닝 트리의 가중치를 출력한다.
3 3
1 2 1
2 3 2
1 3 3
>> 3
import sys
V, E = map(int, sys.stdin.readline().split()) # 정점의 개수 / 간선의 개수
graph = [list(map(int, sys.stdin.readline().split())) for _ in range(E)]
graph.sort(key=lambda x: x[2]) # 간선의 가중치 기준 정렬
parent = [i for i in range(V+1)] # 부모 테이블에 초기에 값 세팅 (자기 자신을 값으로 갖는다)
answer = 0
def find_parent(x):
# 초기에 설정한 값 (자기자신) or 부모 노드를 찾았다면 return
if x == parent[x]:
return x
# 만약 parent[3]=1 로 설정되 있을 경우 재귀호출해서 부모 노드 찾기
parent[x] = find_parent(parent[x])
return parent[x]
def union_tree(a, b):
a = find_parent(a)
b = find_parent(b)
# 임의로 작은 값을 부모로 설정
if b < a:
parent[a] = b
else:
parent[b] = a
for a, b, w in graph:
# 두 노드의 부모 노드가 같지 않다면(공유X) 싸이클 형성하지 않음
if find_parent(a) != find_parent(b):
# 두 노드 합치기
union_tree(a, b)
answer += w
print(answer)