[BOJ알고리즘, C++]#16398_행성 연결, 최소 신장 트리, 크루스칼, Kruskal

2024. 4. 17. 14:19· 문제 풀이/BOJ 문제 풀이
목차
  1. #1. 문제
  2. #2. 풀이
  3. 1. 최소 신장  트리
  4. 2. 크루스칼 알고리즘
  5. 3. 크루스칼은 오름차순 정렬 + Union-Find 연산!
  6. #3. 코드

 

#1. 문제

 

16398번: 행성 연결

홍익 제국의 중심은 행성 T이다. 제국의 황제 윤석이는 행성 T에서 제국을 효과적으로 통치하기 위해서, N개의 행성 간에 플로우를 설치하려고 한다. 두 행성 간에 플로우를 설치하면 제국의 함

www.acmicpc.net

 


 

#2. 풀이

 

1. 최소 신장  트리

 

[자료구조]#6_그래프

#0. 개념 1. 그래프? [정의] : 그래프는 노드와 간선들의 집합으로 이루어진 비 선형 자료구조입니다. 그래프의 노드들은 간선을 통해 연결되어 일종의 네트워크를 형성합니다. 그래프는 노드와

webddevys.tistory.com

최소 신장 트리는 가중치 그래프에서 간선들이 갖는 가중치의 합이 최소가 되는 신장 트리를 의미합니다. 대표적인 최소 신장 트리 알고리즘은 Kruskal 알고리즘(간선 중심+우선순위 큐), Prim 알고리즘(정점 중심), 그리고 Sollyn 알고리즘(집합 중심)이 있습니다. 

 

2. 크루스칼 알고리즘

 

[자료구조]#6_그래프

#0. 개념 1. 그래프? [정의] : 그래프는 노드와 간선들의 집합으로 이루어진 비 선형 자료구조입니다. 그래프의 노드들은 간선을 통해 연결되어 일종의 네트워크를 형성합니다. 그래프는 노드와

webddevys.tistory.com

크루스칼 알고리즘은 간선 중심의 최소 신장 트리 알고리즘입니다. 크루스칼 알고리즘은 무방향 가중치 그래프에서 간선들을 가중치 기준 오름차순 정렬하여 가장 작은 가중치를 갖는 간선부터 차례대로 Union-Find 연산을 통해 최소 신장 트리를 구성합니다. 크루스칼 알고리즘은 간선의 개수가 E일 때, O(E log E)의 시간 복잡도를 갖습니다. 

 

3. 크루스칼은 오름차순 정렬 + Union-Find 연산!

  1. 먼저, Union-Find 연산을 위해 Find() 함수와 Union()함수를 정의합니다.
  2. 간선 목록을 구성하고, Kruskal을 수행합니다.

 


 

#3. 코드

 

/*
    [문제] : 각 행성을 모두 연결하는 최소 신장 트리 비용
    [설명]
            1. 크루스칼 알고리즘 활용
            2. 크루스칼 알고리즘은 간선 중심의 알고리즘으로, 간선 목록 만들기 + Union-Find 연산 구현
*/

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

#define MAX 1001

struct Edge
{
    int u, v, w;
    const bool operator<(const Edge& Other)
    {
        return w < Other.w;
    }
};

int N;
long long MST;
int parent[MAX];
vector<Edge> edges;

int Find(int x)
{
    if(parent[x] != x)
    {
        parent[x] = Find(parent[x]);
    }

    return parent[x];
}

void Union(int rootX, int rootY)
{
    parent[rootX] = rootY;
}

void Kruskal()
{
    // #1. 부모 노드를 자기 자신으로 초기화
    for(int i=0; i<=N; ++i)
        parent[i] = i;

    // #2. 간선 목록을 오름차순 정렬
    sort(begin(edges), end(edges));

    // #3. 간선 목록 순회하며, MST 구성
    for(int i=0; i<(int)edges.size(); ++i)
    {
        int rootX = Find(edges[i].u);
        int rootY = Find(edges[i].v);

        if(rootX != rootY)
        {
            MST += edges[i].w;
            Union(rootX, rootY);
        }
    }

    cout << MST;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> N;

    // #1. 간선 목록 초기화
    for(int i=0; i<N; ++i)
    {
        for(int j=0; j<N; ++j)
        {
            int cost;
            cin >> cost;

            if(i != j)
            {
                edges.push_back(Edge({i,j,cost}));
            }
        }
    }

    // #1. 크루스칼 알고리즘
    Kruskal();

    return 0;
}

 


 

 

 

 

저작자표시 (새창열림)

'문제 풀이 > BOJ 문제 풀이' 카테고리의 다른 글

[BOJ알고리즘, C++]#10282_해킹, 길 찾기 알고리즘, 최단 경로 알고리즘, 다익스트라  (0) 2024.05.06
[BOJ알고리즘, C++]#6603_로또, DFS, 백트래킹, 순열 백트래킹  (0) 2024.04.30
[BOJ알고리즘, C++]#2887_행성 터널, 최소 신장 트리(MST), 크루스칼  (0) 2024.04.08
[BOJ알고리즘, C++]#17472_다리 만들기 2, DFS, 최소 신장 트리(MST), 크루스칼(Kruskal)  (0) 2024.03.15
[BOJ알고리즘, C++]#3665_최종 순위, 그래프, 위상 정렬, 진입 차수 BFS  (0) 2024.03.15
  1. #1. 문제
  2. #2. 풀이
  3. 1. 최소 신장  트리
  4. 2. 크루스칼 알고리즘
  5. 3. 크루스칼은 오름차순 정렬 + Union-Find 연산!
  6. #3. 코드
'문제 풀이/BOJ 문제 풀이' 카테고리의 다른 글
  • [BOJ알고리즘, C++]#10282_해킹, 길 찾기 알고리즘, 최단 경로 알고리즘, 다익스트라
  • [BOJ알고리즘, C++]#6603_로또, DFS, 백트래킹, 순열 백트래킹
  • [BOJ알고리즘, C++]#2887_행성 터널, 최소 신장 트리(MST), 크루스칼
  • [BOJ알고리즘, C++]#17472_다리 만들기 2, DFS, 최소 신장 트리(MST), 크루스칼(Kruskal)
Hardii2
Hardii2
개발 블로그Hardii2 님의 블로그입니다.
Hardii2
개발 블로그
Hardii2
전체
오늘
어제
  • 분류 전체보기
    • 알고리즘
    • 웹 개발
      • Node.js
      • React
    • 게임개발
      • DirectX12
      • 관련 지식
      • Unreal C++
      • Unreal 블루프린트
    • 언어
      • Effective C++
      • Basic C++
      • 디자인 패턴
      • 자료구조
      • 기술 질문
    • 문제 풀이
      • BOJ 문제 풀이
      • Programmers 문제 풀이
      • geeksForgeeks 문제 풀이
    • 수학
      • 확률과 통계
      • 게임수학
    • 개인프로젝트
    • 그룹프로젝트
      • PM
      • Dev
    • Github

블로그 메뉴

  • 홈
  • 글쓰기

공지사항

인기 글

태그

  • 디자인 패턴
  • 기술 질문
  • dfs
  • BFS
  • DP
  • Unreal Blueprint
  • unreal
  • 알고리즘
  • C++
  • programmers
  • 최단 경로
  • 그래프
  • 우선순위 큐
  • 트리
  • 정렬
  • BOJ
  • stl
  • set
  • 개발
  • Effective C++

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Hardii2
[BOJ알고리즘, C++]#16398_행성 연결, 최소 신장 트리, 크루스칼, Kruskal
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.