크루스칼
그래프 내의 모든 정점들을 가장 적은 비용으로 연결하는 알고리즘
Last updated
그래프 내의 모든 정점들을 가장 적은 비용으로 연결하는 알고리즘
Last updated
크루스칼을 이해하기 전에 일단 MST(Minimum Spanning Tree)라는 개념부터 이해해야 합니다.
그래프에서 ①모든 정점을 포함하고 정점 간 서로 연결이 되며 ②싸이클이 존재하지 않는(tree의 기본 조건) 부분그래프 입니다.
위에 그림에서도, a 연결그래프에서 만들어진 부분그래프 b 3개 모두 정점끼리 모두 하나로 연결되어 있고 사이클이 존재하지 않는 것을 볼 수 있죠?
이 중 MST는 이 그래프들 중 가중치의 합이 최소가 되는 신장 트리를 의미합니다. MST의 특징은 자연스럽게 정점이 N개라면 간선은 N-1개가 됩니다.
구하는 로직은 어렵지 않습니다. 위 특징을 이용하면 됩니다.
① 간선들을 가중치 순으로 오름차순 정렬하고 정점들을 각 컴포넌트로 초기화합니다. ② 간선들을 훑으면서 양쪽 정점을 포함한 컴포넌트가 연결되어 있지 않으면(사이클이 형성되지 않는다면) 간선을 뽑고 연결합니다. ③ 간선 V-1개가 뽑혔을 때, 그 간선들과 정점들이 이루는 그래프가 MST입니다.
'사이클이 형성되지 않는다면'의 구현은 앞에서 본 유니온파인드로 해결할 수 있겠죠?
그럼 다음 그래프로 크루스칼을 구현해봅시다. 아래 그래프는 노드가 총 5개니까 4개의 간선을 선택해내면 됩니다!
일단 간선들 사이에서 가장 가중치가 작은 2 가중치의 간선을 선택합니다.
다음으로 가중치가 작은 4를 선택하고,
그 다음으로 가중치가 작은 4를 선택하고 싶은데 아차차! 이렇게 하면 사이클이 만들어져서 안되겠죠?
그래서 다음으로 가중치가 작은 6인 간선을 또 하나 선택합니다.
이제 지금까지 간선 3개를 선택했으니 남은 한 개만 선택하면 됩니다! 남은 간선들 중 가중치가 가장 작은 6을 선택하면 더 이상 사이클을 형성하는 일 없이 크루스칼 알고리즘이 완성됩니다!!
크루스칼의 가장 대표적인 문제를 풀어봅시다. 유니온파인드로 사이클이 이루어지는지 판단해나가면서 가장 가중치가 작은 간선들을 (노드-1)개의 갯수만큼 찾으면 됩니다.
[참고] 아래는크루스칼 알고리즘을 구하는 전체적인 동영상입니다.
X