[백준 1647] 도시 분할 계획 - cpp로 구현한 최소 신장 트리

2024. 10. 17. 23:03·알고리즘

문제 개요

  • 문제 번호: 1647
  • 제목: 도시 분할 계획
  • 난이도: 골드 4
  • 링크: 백준 1647번

문제 설명

N개의 집이 있는데 연결되어있는 도로를 없애 N개의 집들을 2개의 마을 집단으로 분할해야한다.


접근 방법

도로를 지우는 것이 아닌 주어지는 M개의 도로에서 비용이 적은 도로를 선택한다.

이때 마을1과 마을2는 서로 도로가 연결 되어 있으면 안된다. 즉 처음에 N개의 집을 각각의 집합으로 지정하고 도로를 연결할때 마다 집합을 합하여 2개의 집합으로 만들면 된다.

이때 사용되는 알고리즘은 Union-Find를 이용한 크루스칼 알고리즘을 이용한다. 


구현 코드

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

int n, m;
tuple<int, int, int> edge[1000005];
int p[100005];

int find(int x){
    if(p[x] == x) return x;
    return p[x] = find(p[x]);
}

bool is_diff_group(int a, int b){
    a = find(a);
    b = find(b);

    if( a == b) return 0;
    else if(a < b) p[b] = a;
    else p[a] = b;
    return 1;
}

int main(){
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        p[i] = i;

    for(int i = 0; i < m; i++){
        int a, b, c;
        cin >> a >> b >> c;
        edge[i] = {c, a, b};
    }

    sort(edge, edge + m);

    int u = n;
    int ans = 0;
    for(int i = 0; i < m; i++){
        if(u == 2) break;
        int c, a, b;
        tie(c, a, b) = edge[i];

        if(!is_diff_group(a, b)) continue;
        ans += c;
        u--;
    }

    cout << ans;
}

'알고리즘' 카테고리의 다른 글

[백준 1054] 특정한 최단 경로 - c++ 최단 경로 알고리즘 구현  (2) 2024.10.21
[백준 13418] 학교 탐방하기 - c++로 구현한 최소 스패닝 트리  (0) 2024.10.18
코딩테스트를 위한 JavaScript 문법 정리  (1) 2024.10.03
[백준 3986] 좋은 단어 - c++로 구현한 스택 (해설 O)  (0) 2024.08.14
[백준 6198] 옥상 정원 꾸미기 - C++로 구현한 스택  (0) 2024.08.09
'알고리즘' 카테고리의 다른 글
  • [백준 1054] 특정한 최단 경로 - c++ 최단 경로 알고리즘 구현
  • [백준 13418] 학교 탐방하기 - c++로 구현한 최소 스패닝 트리
  • 코딩테스트를 위한 JavaScript 문법 정리
  • [백준 3986] 좋은 단어 - c++로 구현한 스택 (해설 O)
bearn_soo
bearn_soo
추상적으로 받아들이되 구체적으로 이해하라
  • bearn_soo
    초밥구이
    bearn_soo
  • 전체
    오늘
    어제
    • 분류 전체보기 (78)
      • Javascript (16)
      • Node.js (18)
      • 알고리즘 (8)
      • 네트워크 (2)
      • 데이터베이스 (10)
      • 운영체제 (11)
      • 자료구조 (6)
      • 공부기록 (7)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
bearn_soo
[백준 1647] 도시 분할 계획 - cpp로 구현한 최소 신장 트리
상단으로

티스토리툴바