신장 트리 / 최소 비용 신장 트리 / 프림 알고리즘, 크루스칼 알고리즘 - C 언어

2021. 6. 10. 22:05·C
728x90
반응형

트리는 사이클이 없는 연결 그래프

그래프에 대한 설명글은 👇🏻

https://tildacoderecorder.tistory.com/107

 

[ 자료 구조 ] 그래프의 개념과 구조

그래프 : 연결되어 있는 원소 사이의 다:다 관계를 표현하는 자료구조 ( 트리는 1:N 관계 표현 ) 그래프 G = 객체를 나타내는 정점(Vertex)과 객체를 연결하는 간선(Edge)의 집합. G = (V, E) 그래프의 종

tildacoderecorder.tistory.com

 

신장 트리

: n개의 정점으로 이루어진 무방향 그래프G에서 n개의 모든 정점과 n-1개의 간선으로 만들어진 트리

깊이 우선 신장 트리 : 깊이 우선 탐색을 이용해 생성된 신장 트리

너비 우선 신장 트리 : 너비 우선 탐색을 이용해 생성된 신장 트리

 

최소 비용 신장 트리

: 무방향 가중치 그래프에서 신장 트리를 구성하는 간선 들의 가중치 합이 최소인 신장 트리

최소 비용 신장 트리를 만드는 알고리즘

  • 프림 알고리즘
  • 크루스칼의 알고리즘

 

프림 알고리즘

: 간선을 정렬하지 않고 하나의 정점에서 시작하여 트리를 확장해 나가는 방법

  1. 그래프 G에서 시작 정점을 선택한다.
  2. 선택한 정점에 부속된 모든 간선 중에서 가중치가 가장 낮은 간선을 연결하여 트리를 확장한다.
  3. 이전에 선택한 정점과 새로 확장된 정점에 부속된 모든 간선 중에서 가중치가 가장 낮은 간선을 삽입한다. 단, 사이클을 형성하면 안되므로 이런 경우에는 그 다음으로 낮은 가중치를 가진 간선을 선택한다.
  4. 그래프 G에 n-1개 삽입될 때 까지 위 과정을 반복한다.

 

위 그래프를 예시로 시작 정점이 A일 때, A와 연결된 간선들의 가중치는 17, 6, 3이다. 이 중 가장 낮은 가중치를 가진 간선은 (A, B)로 3이다. 정점 A와 정점 B를 이어 트리를 확장한다.

두 정점에서 연결된 간선들의 가중치는 A와 연결된 17과 6, B와 연결된 5와 12가 있는데 이 중 가장 낮은 가중치를 가진 간선은 (B, D)이므로 이 둘을 연결하여 트리를 확장한다.

세 정점에서 연결된 간선들 중 가중치가 가장 낮은 간선은 6인데, A와 D를 이으면 사이클이 되므로 잇지 않는다. (A, D)를 제외한 간선 중 가중치가 가장 낮은 것은 (D, E)이므로 이 둘을 연결한다.

위와 같은 과정을 n-1번, 즉 6번 반복한다면 아래와 같은 최소 비용 신장 트리를 확인할 수 있다.

 

 

크루스칼 알고리즘

: 가중치가 낮은 간선을 삽입하면서 최소 비용 신장 트리를 만드는 방법

  1. 그래프 G의 모든 간선을 가중치에 따라 오름차순으로 정리한다.
  2. 그래프 G에 가중치가 가장 낮은 간선을 삽입한다. 이 때, 사이클을 형성하면 안되므로 이런 경우 그 다음으로 낮은 가중치를 가진 간선을 삽입한다.
  3. 그래프 G에 간선이 n-1개 삽입될 때 까지 반복한다.

 

위에서 사용한 그래프의 간선들을 가중치에 따라 오름차순으로 정렬했다.

가중치가 가장 낮은 간선 (E, G)를 연결한다. 그 다음 가중치를 가진 (A, B)도 연결한다. 그 다음 가중치를 가진 (E, F)도 연결한다. (B, D)도 연결.

하지만 이 때, 가중치 6을 가진 (A, D)를 연결하면 사이클이 만들어지므로 연결하지 않는다. 그 다음 간선 (C, F)는 연결해도 사이클이 생기지 않으니 연결. (D, E)도 연결.

(C, E)를 연결하면 사이클이 생기므로 연결하지 않는다. 끝까지 반복해도 좋지만 여기까지 넘어오기 이전에 이미 간선을 연결하는 작업을 n-1번, 6번 했으므로 신장 트리는 완성된 상태이다. 더 이상의 반복은 무의미하다.

 

반복이 끝나면 위와 같은 최소 비용 신장 트리가 만들어진다. 프림 알고리즘의 결과와 동일하다.

 

참고 : C로 배우는 쉬운 자료구조 / 이지영 / 한빛아카데미

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'C' 카테고리의 다른 글

균형 이진 탐색 트리 : AVL 트리와 회전 연산 - C 언어  (0) 2021.10.18
Union-Find 알고리즘 (동치류 문제) / 크루스칼 알고리즘 - C 언어  (0) 2021.06.11
그래프의 개념과 구조 - C 언어  (0) 2021.06.08
heap의 개념과 구조, 삽입/삭제 연산 - C언어  (0) 2021.06.01
이진 탐색 트리의 탐색/삽입/삭제 연산 - C언어  (1) 2021.05.30
'C' 카테고리의 다른 글
  • 균형 이진 탐색 트리 : AVL 트리와 회전 연산 - C 언어
  • Union-Find 알고리즘 (동치류 문제) / 크루스칼 알고리즘 - C 언어
  • 그래프의 개념과 구조 - C 언어
  • heap의 개념과 구조, 삽입/삭제 연산 - C언어
waVwe
waVwe
    반응형
  • waVwe
    waVwe 개발 블로그
    waVwe
  • 전체
    오늘
    어제
    • ALL (184)
      • Python (1)
      • Spring (15)
      • DevOps (10)
      • Git (6)
      • JAVA (4)
      • C (22)
      • 코테 문제 풀이 (124)
        • 프로그래머스 (43)
        • 백준 (2)
        • 정올 (64)
        • SW Expert Academy (1)
        • 온코더 oncoder (14)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

    • 🐙 Github
  • 공지사항

  • 인기 글

  • 태그

    springboot
    깃
    java
    CI/CD
    스파르타코딩
    while문
    MSA
    내일배움캠프
    알고리즘
    온코더
    progate
    C
    Til
    아파치카프카
    연결리스트
    스프링부트
    자바
    스프링
    코테
    정올
    자료구조
    깃헙
    docker
    도커
    이진트리
    형변환
    스파르타코딩클럽
    devops
    프로그래머스
    C언어
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
waVwe
신장 트리 / 최소 비용 신장 트리 / 프림 알고리즘, 크루스칼 알고리즘 - C 언어
상단으로

티스토리툴바