1197 : 최소 스패닝 트리

JinJinJara·2023년 8월 19일
0

문제

그래프가 주어졌을 때, 그 그래프의 최소 스패닝 트리를 구하는 프로그램을 작성하시오.

최소 스패닝 트리는, 주어진 그래프의 모든 정점들을 연결하는 부분 그래프 중에서 그 가중치의 합이 최소인 트리를 말한다.

입력

첫째 줄에 정점의 개수 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)

0개의 댓글