가장 적은 비용(간선연결)을 통해 모든 노드를 연결하는 방법을 도출하는 알고리즘이다.
최적의 비용을 도출하는 알고리즘을 공부하는 것부터 시작한다.
크루스칼 알고리즘을 구현할 때 만족해야하는 조건이 4가지 존재한다.
크루스칼 알고리즘은 union-find(노드를 합치고, 부모노드를 일치시키는 알고리즘)을 활용한다.
array = [0, 1, 2, 3, 4, 5, 6, 7, 8]
# 부모노드 찾기(1차구성)
def getParent(array, value):
if array[value] == value:
return array[value]
return getParent(array, array[value])
# 부모노드 합치기(2차구성)
def unionParent(array, value1, value2):
value1 = getParent(array, value1)
value2 = getParent(array, value2)
if value1 < value2:
array[value2] = value1
else:
array[value1] = value2
# 같은 부모를 가지는지(같은 graph의 node인지) 확인하기
def findParent(array, value1, value2):
value1 = getParent(array, value1)
value2 = getParent(array, value2)
if value1 == value2:
return True
else:
return False
#간선정보
edges = [
[12, 1, 7],
[28, 1, 4],
[67, 1, 2],
[24, 2, 4],
[62, 2, 5],
[20, 3, 5],
[37, 3, 6],
[13, 4, 7],
[45, 5, 6],
[73, 5, 7]
]
edges.sort()
result = 0
for edge in edges:
cost, node1, node2 = edge
if findParent(array, node1, node2):
pass
else:
unionParent(array, node1, node2)
result = result + cost
print(result)
간선정보를 class 형태로 전달받을 수 있을지, sys.stdin.readline()을 통해 입력받아 정보를 전달받을 수 있을지 고민해본다.