612 최소신장트리
| parent_topic | 600-알고리즘 & 코딩테스트 |
| types | |
| tags |
##신장트리 ##최소신장트리 ##MST ##KruskalAlgorithm ##UnionFind ##Python ##그래프 ##사이클검출 ##최소비용
|
신장트리 : 하나의 그래프가 있을때 모든 노드를 포함하면서 사이클이 없는 그래프
크루스칼은 최소신장트리(mst)를 구할때 사용함
크리스칼 알고리즘을 이용!!
정렬 기준이 edge이다!!
최소신장트리로 분할할라면 최소신장트리를하나만들고 젤큰간선을 없애면된다
$O(ElogE)$
예로 다리를 최소한의 비용으로 놓아야하지만 다 놓아야할 때
- 간선을 비용에 따라 오름차순으로 정렬한다
- 사이클발생하는지 확인하고 발생하지 않을 시 mst에 포함시킨다.
- 이때 unionfind
# 입력형식 a,b,c
# 저장형식 edges.append((c,a,b)) 비용을 앞으로
# node 개수 v
parent = [0] * (v+1)
sum_cost = 0
edges.sort()
def find_parent(parent,n):
if parent[n] != n:
parent[n] = find_parent(parent,parent[n])
return parent[n]
for e in edges:
c , a,b = e
pa = find_parent(parent,a)
pb = find_parent(parent,b)
if pa != pb:
sum_cost += c
# 루트노드의 부모끼리 연결해야함
if pa < pb:
parent[pb] = pa
else:
parent[pa] = pb