문제 풀이

BOJ 13244 - Tree [C++]

khj20006 2025. 1. 22. 08:54
반응형

문제

https://www.acmicpc.net/problem/13244

 

그래프가 주어지면, 트리인지 아닌지 판별하는 문제다.

multiedge가 주어질 수 있다는 점에 유의해야 한다.

풀이

트리인지 판별하는 가장 간단하고 쉬운 방법은 분리 집합을 이용하는 것이라 생각한다.

union 연산이 정확히 N-1번 발생함과 동시에 간선의 개수가 N-1개라면, 주어진 그래프는 트리이다.

 

#include <iostream>
#include <functional>
#include <numeric>
using namespace std;

int main() {
    cin.tie(0)->sync_with_stdio(0);

    int T, N, M, a, b, r[1001]{};
    function<int(int)> f = [&](int x) -> int { return x == r[x] ? x : r[x] = f(r[x]); };
    for (cin >> T; T--;) {
        cin >> N >> M;
        int cnt = 0;
        for (iota(r, r + N + 1, 0); M--;) {
            cin >> a >> b;
            int x = f(a), y = f(b);
            if (x == y) cnt += N;
            else r[x] = y, cnt++;
        }
        cout << (cnt == N - 1 ? "tree\n" : "graph\n");
    }

}

 

반응형