신장트리
- 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프
- 즉, 사이클 없이 모든 노드가 연결됨 (=트리)
최소 신장 트리 알고리즘 => E(logE)
- 최소 비용으로 만들 수 있는 신장트리를 찾는 알고리즘
- 간선 개수 = 노드 개수 - 1
- 대표적으로 크루스칼 알고리즘이 있음
- 간선을 가중치에 따라 오름차순 정렬
- 사이클이 발생하지 않는 경우 MST에 포함
코드
n,m = map(int, input().split()) #n=노드 m=간선
edges = []
parent = [i for i in range(n+1)] #부모를 본인으로 초기화
result = 0
def find(x):
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
def union(a,b):
a = find(a)
b = find(b)
if a < b:
parent[b] = a
else:
parent[a] = b
for i in range(m):
a,b,cost = map(int, input().split())
edges.append((cost,a,b)) #간선치 순으로 정렬하기 위해 위치를 바꿈
edges.sort()
for edge in edges:
cost,a,b = edge #위치 주의하기
if find(a) != find(b): #사이클이 없는 경우(=루트 노드가 다른 경우) mst에 포함시킴
union(a,b)
result+=cost
print(result)
관련 문제 풀이
'🔅코딩테스트 공부🔅 > ❗알고리즘 추가 공부' 카테고리의 다른 글
[알고리즘] 위상정렬 + 문제풀이 (0) | 2023.03.02 |
---|---|
[알고리즘] UNION FIND(서로소 집합 알고리즘) (0) | 2023.02.27 |
[알고리즘] 최단경로(다익스트라, 플로이드워셜, 벨만포드) (0) | 2023.02.24 |
[알고리즘] 분할과 정복 + 문제풀이 (0) | 2023.02.13 |
[알고리즘] 다이나믹 프로그래밍 + 문제풀이 (0) | 2023.02.09 |
댓글