Algorithm/graph
[백준] 알고리즘 10451번 - 순열 사이클 문제
낭강
2021. 1. 22. 02:10
#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를 이용하면 간단하게 해결되는 문제입니다.