신장 트리
- 하나의 그래프가 있을 때 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프
- 성립 조건 : 모든 노드가 포함되어 있고, 사이클이 존재하지 않아야 한다.
크루스칼 알고리즘
- 모든 도시를 연결할 때 최소한의 비용으로 신장 트리를 만드는 알고리즘
- 그리디 알고리즘으로 분류
- '최소 신장 트리 알고리즘'이라고도 불림
- 최소 신장 트리는 일종의 트리 자료 구조이므로, 최종적으로 신장 트리에 포함되는 간선의 개수가 '노드의 개수 - 1'과 같다는 특징이 있다.
1. 간선 데이터를 비용에 따라 오름차순으로 정렬한다.
2. 간선을 하나씩 확인하며 현재의 간선이 사이클을 발생시키는지 확인한다.
- 사이클이 발생하지 않는 경우, 최소 신장 트리에 포함시킨다.
- 사이클이 발생하는 경우, 최소 신장 트리에 포함시키지 않는다.
3. 모든 간선에 대하여 2번의 과정을 반복한다.
구현
def find_parent(x):
if parent[x] != x:
parent[x] = find_parent(parent[x])
return parent[x]
def union_parent(a, b):
a = find_parent(a)
b = find_parent(b)
if a<b:
parent[b]=a
else:
parent[a]=b
v, e = map(int, input().split())
parent=[0] * (v+1)
for i in range(1, v+1):
parent[i] = i
result = 0
edges = []
for _ in range(e):
a, b, cost = map(int, input().split())
edges.append((cost, a, b))
edges.sort()
for edge in edges:
cost, a, b = edge
if find_parent(a) != find_parent(b):
union_parent(a, b)
result += cost
print(result)
시간 복잡도
O(ElogE)
간선의 개수 E
크루스칼 알고리즘에서 시간이 가장 오래 걸리는 부분이 간선을 정렬하는 작업 -> O(ElogE)
크루스칼 내부에서 사용되는 서로소 집합 알고리즘의 시간 복잡도는 정렬 알고리즘의 시간 복잡도 보다 작으므로 무시
댓글