[알고리즘] 크루스칼(Kruskal)
크루스칼(Kruskal) 알고리즘이란?
크루스칼 알고리즘이란 MST(최소 신장 트리)를 찾는 알고리즘이다.
- 모든 간선 데이터를 가중치에 따라 오름차순으로 정렬
- 간선을 하나씩 확인하며 사이클 발생여부를 판별 → find연산으로 같은 집합에 속하는지 확인
- 사이클이 발생하지 않는다 → MST집합에 포함 / 발생한다 → 포함 X
- 모든 간선에 대해 2, 3번을 반복한다.
위 알고리즘을 보면 알 수 있겠지만 간선 데이터를 오름차순으로 정렬하고 이를 순차적으로 뽑아 최적의 해를 도출할 수 있기 때문에 그리디 알고리즘으로 분류된다.
시간복잡도는 모든 간선을 오름차순으로 정렬하는 것이 O(ElogE)로 가장 오래걸린다. union-find를 하는 과정은 이보다 시간복잡도가 적기 때문에 크루스칼 알고리즘의 시간복잡도는 O(ElogE)이다.
구현(Python)
def find(x, parent[x]):
if x != parent[x]:
parent[x] = find_parent(parent[x], parent)
return parent[x]
def union(a, b, parent):
a = find(a, parent)
b = find(b, parent)
if a < b:
parent[b] = a
else:
parent[a] = b
def solution(v, edges): # edges = [cost, a, b]
parent = [0] * (v + 1)
for i in range(v):
parent[i] = i
edges.sort() # 오름차순 정렬
answer = 0
for cost, a, b in edges:
# 사이클이 발생하지 않는 경우에 대해서만 MST에 포함
if find(a, parent) == find(b, parent):
union(a, b, parent)
answer += cost
return answer