본문 바로가기

자료구조 C++

크루스칼

1. 신장 트리

 

  • 그래프에서 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프를 의미함.
  • 모든 노드가 포함되어 서로 연결되면서 사이클이 존재하지 않는다는 조건은 트리의 조건이 됨.

 

2. 최소 신장 트리

 

  • 최소한의 비용으로 구성되는 신장 트리를 찾아야 할 때 어떻게 해야 할까요?
  • N개의 도시가 존재하는 상황에서 두 도시 사이에 도로를 놓아 전체 도시가 서로 연결될 수 있게 도로를 설치하는 경우 => 두 도시 A,B를 선택했을 때 A에서 B로 이동하는 경로가 반드시 존재하도록 도로를 설치합니다.

3. 크루스칼 알고리즘

 

  • 대표적인 최소 신장 트리 알고리즘
  • 그리디 알고리즘으로 분류
  • 구체적인 동작 과정
  • 1. 간선 데이터를 비용에 따라 오름차순으로 정렬
  • 2. 간선을 하나씩 확인하며 현재의 간선이 사이클을 발생시키는지 확인함. 
  • 2-1) 사이클이 발생하지 않는 경우 최소 신장 트리에 포함 시킴
  • 2-2) 사이클이 발생하는 경우 최소 신장 트리에 포함시키지 않음.
  • 3. 모든 간선에 대해 2번의 과정 반복.

4. 크루스칼 알고리즘 : 동작 과정

 

  • [초기 단계] 그래프의 모든 간선 정보에 대하여 오름차순 정렬을 수행.

  • [Step1] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (3, 4)을 선택하여 처리.
  • [Step2] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (4, 7)을 선택하여 처리.
  • [Step3] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (4, 6)을 선택하여 처리.
  • [Step4] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (6, 7)을 선택하여 처리.
  • [Step5] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (1, 2)을 선택하여 처리.
  • [Step6] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (2, 6)을 선택하여 처리.
  • [Step7] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (2, 3)을 선택하여 처리.
  • [Step8] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (5, 6)을 선택하여 처리.
  • [Step9] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (1, 5)을 선택하여 처리.

 

  • [알고리즘 수행 결과]
  • 최소 신장 트리에 포함되어 있는 간선의 비용만 모두 더하면, 그 값이 최종 비용에 해당.

 

5. 코드 구현 (C++)

 

 

 

6. 크루스칼 알고리즘 성능 분석

 

  • 크루스칼 알고리즘은 간선의 개수가 E개 일 때, O(ElogE)의 시간 복잡도를 가짐.
  • 크루스칼 알고리즘에서 가장 많은 시간을 요구하는 곳은 간선을 정렬을 수행하는 부분임.
  • 표준 라이브러리를 이용해 E개의 데이터를 정렬하기 위한 시간 복잡도는 O(ElogE)이기 때문.

'자료구조 C++' 카테고리의 다른 글

위상 정렬  (0) 2021.04.12
그리디 알고리즘  (0) 2021.03.05
DFS와 BFS  (0) 2021.02.24
동적 프로그래밍(Dynamic Programming) - DP  (0) 2021.02.13
9. 우선 순위 큐 (Heap)  (0) 2021.02.07