반응형
#include <bits/stdc++.h>
using namespace std;
int arr[100001];
bool vis[100001];
bool done[100001];
int cnt= 0;
void DFS(int x) {
vis[x] = 1;
int nx = arr[x];
if (!vis[nx]) {
DFS(nx);
}
else if(!done[nx]) {
for (int i = nx; i != x; i = arr[i]) {
cnt++;
}
cnt++;
}
done[x] = 1;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
for (int T = 0; T < t; T++) {
int n;
cin >> n;
memset(arr, 0, sizeof(arr));
memset(vis, 0, sizeof(vis));
memset(done, 0, sizeof(done));
cnt = 0;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
DFS(i);
}
}
cout << n - cnt << '\n';
}
return 0;
}
DFS로 O(n)으로 cycle을 찾아 낼 수 있다
반응형
'Algorithm > etc' 카테고리의 다른 글
우선순위 큐와 벡터 정렬 시간복잡도 차이 - Priority queue vs Vector sort (0) | 2022.03.07 |
---|---|
Network FLow 최대 유량 알고리즘 (0) | 2022.02.22 |
Segment Tree 구현 코드 C++ (0) | 2022.02.11 |
플로이드 워샬 알고리즘이란? (냅색 응용) -모든 정점의 최단 거리 구하기 (0) | 2022.01.28 |
냅색 알고리즘(한번 만 사용가능) 2차원, 1차원 배열 (0) | 2022.01.26 |