
그래프의 최소 스패닝 트리를 구하라
입력
최소 비용 신장 트리에는 여러 가지 종류의 알고리즘이 존재하지만 중요한 것은 간선이 음수인 경우이다.
이 경우에는 "사이클"을 형성하지 않으면서 간선이 음수인 것도 알아야 하므로 크루스칼 알고리즘을 바로 적용하면 된다.
"크루스칼 알고리즘" 의 핵심 개념은 간선을 거리가 짧은 순서대로 그래프에 포함시키는 것이다. 즉, 모든 노드들을 최대한 적은 비용으로 '연결'만 시키면 되므로 모든 간선 정보를 오름차순으로 정렬한 뒤에 비용이 작은 간선부터 그래프에 포함시킨다.
V, E = map(int, input().split())
parent = {i : i for i in range(1, V+1)}
rank = {i : 0 for i in range(1, V+1)}
graph_edges = []
for _ in range(E):
    A, B, C = map(int, input().split())
    graph_edges.append([C, A, B])
# 해당 vertice의 최상위 정점을 찾기
def find(vertices):
    if parent[vertices] != vertices:
        parent[vertices] = find(parent[vertices])
    return parent[vertices]
def union(vertice1, vertice2):
    root1 = find(vertice1)
    root2 = find(vertice2)
    if root1 != root2:
        if rank[root1] > rank[root2]:
            parent[root2] = root1
        else:
            parent[root1] = root2
            if rank[root1] == rank[root2]:
                rank[root2] += 1
def kruskal(edges):
    mst = []
    edges.sort()
    for edge in edges:
        w, v1, v2 = edge
        if find(v1) != find(v2):
            union(v1, v2)
            mst.append(w)
    return sum(mst)
print(kruskal(graph_edges))