본문 바로가기
코딩/cpp

[백준]11724번

by 적막한숲 2025. 9. 29.

union_find structure로 해결하는 문제다

#include <iostream>
#include <vector>

std::vector<int> parent;

int find(int x) {
    if (parent[x] != x) {
        parent[x] = find(parent[x]);  // path compression
    }
    return parent[x];
}

void unite(int x, int y) {
    int rootX = find(x);
    int rootY = find(y);
    if (rootX != rootY) {
        parent[rootY] = rootX;
    }
}

int main() {
    int n, m;
    std::cin >> n >> m;

    parent.resize(n);
    for (int i = 0; i < n; i++) {
        parent[i] = i;  // 각 노드의 부모를 자기 자신으로 초기화
    }

    for (int i = 0; i < m; i++) {
        int x, y;
        std::cin >> x >> y;
        unite(x-1, y-1);  // 1-indexed를 0-indexed로 변환
    }

    std::vector<bool> isRoot(n, false);
    for (int i = 0; i < n; i++) {
        isRoot[find(i)] = true;
    }

    int count = 0;
    for (int i = 0; i < n; i++) {
        if (isRoot[i]) {
            count++;
        }
    }

    std::cout << count << std::endl;

    return 0;
}

'코딩 > cpp' 카테고리의 다른 글

[nginx] 초심자 가이드  (0) 2025.09.30
[nginx/포트폴리오 프로젝트] proxy_pass란 무엇인가  (0) 2025.09.30
[백준] 11279번  (0) 2025.09.29
[백준] 2805번  (0) 2025.09.28
[백준] 2630번  (0) 2025.09.28