728x90
https://www.acmicpc.net/problem/1197
1197번: 최소 스패닝 트리
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이
www.acmicpc.net
해당 문제는 Union, Find 문제로 최소 신장 트리를 구하는 문제이다. 간선의 개수를 입력받고, 간선을 짧은순으로 정렬한뒤 순서대로 정점을 Union 하는데, 사이클이 생기지 않게 Find로 부모를 확인한뒤 Union 하면된다.
V, E = map(int, input().split())
parent = [v1 for v1 in range(V+1)] # 정점의 개수만큼 생성
def find(v1):
if v1 !=parent[v1]:
parent[v1] = find(parent[v1])
return parent[v1]
def union(a, b):
a = find(a)
b = find(b)
# 작은 루트 노드를 기준으로 합침
if b < a:
parent[a] = b
else:
parent[b] = a
graph = []
for _ in range(E): # 간선의 개수
a, b ,c = map(int, input().split())
graph.append([c, a, b])
graph.sort()
result = 0
for cost, a , b in graph:
if find(a) != find(b):
union(a, b)
result += cost
print(result)
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 11437번 : LCA (0) | 2023.08.03 |
---|---|
[백준] 2263번 : 트리의 순회 (0) | 2023.08.01 |
[백준] 17472번 : 다리 만들기 2 (0) | 2023.07.31 |
[백준] 1011번 : Fly me to the Alpha Centauri (0) | 2023.07.30 |
[백준] 2573번 : 빙산 (0) | 2023.07.30 |