농담곰담곰이의곰담농

1197. 최소 스패닝 트리

by 브이담곰

 

https://www.acmicpc.net/problem/1197

✔ 유형 : 최소 신장 트리, 크루스칼 알고리즘, union find

✔ 문제 풀이: union find 알고리즘을 이용하여 거리가 최소인 간선과 정점을 선택하여 V-1개의 간선을 가진 부분 그래프를 만든다.

 

 

⬇️코드

 

import sys
input=sys.stdin.readline # input함수 바꾸기

# union find algorithm
def find_parent(parent,x):
    if parent[x] != x:
        parent[x] = find_parent(parent,parent[x])
        
    return parent[x]

def union(parent,a,b):
    a = find_parent(parent,a)
    b = find_parent(parent,b)
    
    if a < b:
        parent[b] = a
    else:
        parent[a] = b
    
    
#input
V , E = map(int, input().split())
parent = [0]*(V+1) #부모 테이블 초기화 하기

edges = []
result = 0

for i in range(1, V + 1):
	parent[i] = i
 
#Vertex info
for i in range(E):
    A, B, C = map( int, input().split() ) #  각 간선에 대한 정보
    # A번 정점과 B번 정점이 가중치 C인 간선으로 연결되어있다. C는 음수일 수 있다.
    # 가중치를 오름차순으로 정렬해야되기 때문에 첫 원소를 비용으로 둠!!
    edges.append((C, A, B))
    
# 비용을 오름차순으로 정렬!!!!!!
edges.sort()

for edge in edges:
    cost, a, b = edge
    
    if find_parent(parent, a) != find_parent(parent,b):
        union(parent, a, b)
        result += cost
        
#ouput
#최소 스패닝 트리의 가중치를 출력.
print(result)

'Coding Test > Baekjoon' 카테고리의 다른 글

1707. 이분 그래프  (1) 2024.07.18
11725. 트리의 부모 찾기  (0) 2024.07.18
5639. 이진 검색 트리  (0) 2024.07.18
2630. 색종이 만들기  (0) 2024.07.11
2805. 나무 자르기  (0) 2024.07.11

블로그의 정보

농담곰담곰이의곰담농

브이담곰

활동하기