본래의 그래프의 모든 노드를 포함해야 함
모든 노드가 서로 연결
트리의 속성을 만족시킴 (사이클이 존재하지 않음)
탐욕 알고리즘을 기초로 하고 있음 (당장 눈 앞의 최소 비용을 선택해서, 결과적으로 최적의 솔루션을 찾음)
<th style="text-align:center">N</th>
<th style="text-align:center">$ log^*{N} $</th>
<td style="text-align:left">1</td>
<td style="text-align:left">0</td>
<td style="text-align:left">2</td>
<td style="text-align:left">1</td>
<td style="text-align:left">4</td>
<td style="text-align:left">2</td>
<td style="text-align:left">16</td>
<td style="text-align:left">3</td>
<td style="text-align:left">65536</td>
<td style="text-align:left">4</td>
<td style="text-align:left">$ 2^{65536} $</td>
<td style="text-align:left">5</td>
mygraph = { 'vertices': ['A', 'B', 'C', 'D', 'E', 'F', 'G'], 'edges': [ (7, 'A', 'B'), (5, 'A', 'D'), (7, 'B', 'A'), (8, 'B', 'C'), (9, 'B', 'D'), (7, 'B', 'E'), (8, 'C', 'B'), (5, 'C', 'E'), (5, 'D', 'A'), (9, 'D', 'B'), (7, 'D', 'E'), (6, 'D', 'F'), (7, 'E', 'B'), (5, 'E', 'C'), (7, 'E', 'D'), (8, 'E', 'F'), (9, 'E', 'G'), (6, 'F', 'D'), (8, 'F', 'E'), (11, 'F', 'G'), (9, 'G', 'E'), (11, 'G', 'F') ]}
parent = dict()rank = dict()def find(node): # path compression 기법 if parent[node] != node: parent[node] = find(parent[node]) return parent[node]def union(node_v, node_u): root1 = find(node_v) root2 = find(node_u) # union-by-rank 기법 if rank[root1] > rank[root2]: parent[root2] = root1 else: parent[root1] = root2 if rank[root1] == rank[root2]: rank[root2] += 1def make_set(node): parent[node] = node rank[node] = 0def kruskal(graph): mst = list() # 1. 초기화 for node in graph['vertices']: make_set(node) # 2. 간선 weight 기반 sorting edges = graph['edges'] edges.sort() # 3. 간선 연결 (사이클 없는) for edge in edges: weight, node_v, node_u = edge if find(node_v) != find(node_u): union(node_v, node_u) mst.append(edge) return mst
kruskal(mygraph)
[(5, 'A', 'D'),
(5, 'C', 'E'),
(6, 'D', 'F'),
(7, 'A', 'B'),
(7, 'B', 'E'),
(9, 'E', 'G')]