#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를 이용하면 간단하게 해결되는 문제입니다.
'Algorithm > graph' 카테고리의 다른 글
[백준] 알고리즘 2178번 - 미로 탐색 문제 (0) | 2021.01.28 |
---|---|
[백준] 알고리즘 7576번 - 토마토 문제 (0) | 2021.01.27 |
[백준] 알고리즘 2667번 - 단지번호붙이기 문제 (0) | 2021.01.26 |
[백준] 알고리즘 9466번 - 텀 프로젝트 문제 (0) | 2021.01.24 |
[백준] 알고리즘 2331번 - 반복수열 문제 (0) | 2021.01.22 |