신장트리는 모든 노드가 연결되어 있지만 일부 간선을 사용하지 않아도 괜찮다.
- 간선 데이터를 비용에 따라 오름차순으로 정렬
- 간선을 하나씩 확인하며 현재의 간선이 사이클을 발생시키는지 확인
- 사이클이 발생하지 않는 경우 최소 신장 트리에 포함
- 사이클이 발생하는 경우 최소 신장 트리에 포함하지 않음
총 간선의 갯수는 9개
최종적으로 만들어지는 최소 신장 트리의 간선의 갯수는 (전체 노드의 갯수 - 1)개
# 특정 원소가 속한 집합 찾기
def find_parent(parent, x):
# 루트 노드를 찾을 때까지 재귀 호출
if parent[x] != x:
parent[x] = find_parent(parent, parent[x])
return parent[x]
# 두 원소가 속한 집합 합치기
def union_parent(parent, a, b):
a = find_parent(parent, a)
b = find_parent(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
# 노드의 개수, 간선(Union 연산)의 개수, 최종 비용 담을 변수 생성
v, e = 7,9
result = 0
# 부모 테이블상에서, 부모를 자기 자신으로 초기화
parent = [0] * (v+1) #부모 테이블 생성
for i in range(1, v+1):
parent[i] = i
# 모든 간선에 대한 정보를 입력 받기
edges = [(1,2,29),(1,5,75),(2,3,35),(2,6,34),(3,4,7),(4,6,23),(4,7,13),(5,6,53),(6,7,25)]
# 간선을 비용순으로 정렬
edges.sort(key = lambda x: x[2])
# 간선을 하나씩 확인하여
for edge in edges:
a, b, cost = edge
# 사이클이 발생하지 않는 경우에만 집합에 포함
if find_parent(parent,a) != find_parent(parent, b):
union_parent(parent, a, b)
result += cost
print(f'최소신장트리의 비용은 {result} 입니다.') # 159