반응형
[알고리즘] 크루스칼(Kruskal) 알고리즘
신장 트리
: 하나의 그래프가 있을 때 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프최소 신장 트리 알고리즘
: 신장 트리 중에서 최소 비용으로 만들 수 있는 신장 트리를 찾는 알고리즘- 대표적인 최소 신장 트리 알고리즘:
크루스칼 알고리즘
- 대표적인 최소 신장 트리 알고리즘:
- 알고리즘 동작 과정
- 간선 데이터를 비용에 따라 오름차순으로 정렬
- 간선을 하나씩 확인하며 현재의 간선이 사이클을 발생시키는지 확인
- 사이클이 발생하지 않는 경우 최소 신장 트리에 포함
- 사이클이 발생하는 경우 최소 신장 트리에 포함시키지 않음
- 모든 간선에 대해 2번의 과정을 반복
-
크루스칼 알고리즘 소스코드
-
입력 예시
# 노드 7개, 간선 9개 7 9 # 1번 노드에서 2번 노드로 가는 비용: 29 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
-
소스코드
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 v, e = map(int, input().split()) parent = [0] * (v+1) # 모든 간선을 담을 리스트와 최종 비용을 담을 변수 edges = [] result = 0 for i in range(1, v+1): parent[i] = i 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(parent, a) != find_parent(parent, b): union_parent(parent, a, b) result += cost print(result)
-
출력
159
-
반응형
'자료구조 및 알고리즘 > 알고리즘' 카테고리의 다른 글
[알고리즘] BFS(너비 우선 탐색) 정리 (0) | 2021.02.15 |
---|---|
[알고리즘] 위상정렬 (0) | 2021.02.12 |
[알고리즘] 유니온 파인드(Union-find) 알고리즘 (0) | 2021.02.10 |
[알고리즘] 플로이드 워셜(Floyd-Warshall) 알고리즘 (0) | 2021.02.09 |
[알고리즘] 다익스트라(Dijkstra) 알고리즘 with heapq (0) | 2021.02.08 |