본문으로 바로가기

#include <bits/stdc++.h>
using namespace std;
vector<int> v1[1001];
bool check[1001];
void dfs(int x) {
    int size = v1[x].size();
    check[x] = true;
    for (int i = 0; i < size; i++) {
        if (check[v1[x][i]] == false) {
            check[v1[x][i]] = true;
            dfs(v1[x][i]);
        }
    }
}
int main() {
    int T;
    cin >> T;
    while (T--) {
        int n,ans=0;
        cin >> n;
        for (int i = 1; i <= n; i++) {
            int x;
            cin >> x;
            v1[i].push_back(x);
        }
        for (int i = 1; i <= n; i++) {
            if (!check[i]) {
                dfs(i);
                ans++;
            }
        }
        cout << ans << "\n";
        for (int i = 1; i <= n; i++) {
            v1[i].clear();
            check[i] = false;
        }
    }
}

방향있는 연결 요소라고 생각하고 문제를 접근하여 풀었습니다.

DFS를 이용하면 간단하게 해결되는 문제입니다.