- toc {:toc}
νμ΄
λ¬Έμ μ λν μ€λͺ μ μκ°ννλ©΄ λ€μκ³Ό κ°λ€.
λ€μμ κ·Έλν ꡬ쑰μ νΉμ§μ λ€μκ³Ό κ°λ€.
- λ°©ν₯μ΄ μλ€.
- μ¬μ΄ν΄μ΄ λ°μν μ μλ€.
- μκΈ° μμ μ μ ννλ 루νκ° μλ€.
λ³΄λ€ λ μ½κ² μκ°ννλ©΄ λ€μκ³Ό κ°λ€.
1, 2, 3, 5λ 3μ΄ μκΈ° μμ μ μ ννκΈ° λλ¬Έμ μ¬μ΄ν΄μ΄ λ§λ€μ΄μ§μ§ μλλ€. λ°λ©΄, 4, 6, 7μ μ¬μ΄ν΄μ΄ λ§λ€μ΄μ Έ κ²°κ³Όκ°μ λμμμ μ μΈλλ€.
νμ΄ λ°©μμ λ€μκ³Ό κ°λ€.
- 1λΆν° μ 체 μλ₯Ό λ°λ³΅νμ¬ λ°©λ¬Έν μ μ΄ μλ€λ©΄ cycle ν¨μμ λ£μ΄μ€λ€.
- cycle ν¨μλ₯Ό ν΅ν΄ μ¬μ΄ν΄μ 체ν¬ν΄μ€λ€.
- μ¬μ΄ν΄μ λ€μ΄κ° μμ§ μμ μλ₯Ό 체ν¬ν΄μ€λ€.
cycle ν¨μμ νμ΄ λ°©μμ λ€μκ³Ό κ°λ€.
- xλ₯Ό 체ν¬κ°μ΄λΌ μκ°νλ€. 방문체ν¬λ 체ν¬κ°μΌλ‘ μ§ννλ€. vis[cur] = x;
- ν΄λΉ ν¨μ μμμ μ¦, μ κ·Έλ¦Όμμ x=4μ΄κ³ μ¬μ΄ν΄μ λμ λ€μ 4λ‘ μ΄λν κ²½μ°μ΄λ€. ν΄λΉ κ²½μ° μ²΄ν¬κ°μ΄ xμ΄κΈ° λλ¬Έμ vis[cur]== x λΌλ©΄ -1λ‘ μ¬μ΄ν΄μ΄λΌλ κ²μ 체ν¬ν΄μ€λ€.
- λ§μ½, νμ¬ x=6 μΌ λλ₯Ό μκ°νλ©΄ x=4μΌ λ μ΄λ―Έ μ¬μ΄ν΄μ΄ ν λ² μ²΄ν¬κ° λ μν©μ΄λ€. λλ¬Έμ μ¬μ΄ν΄μ λ€μ νμΈν νμμμ΄ λ°ννλ€.
- vis κ° -1μ΄ μλ κ²½μ°, μ¦, μ¬μ΄ν΄μ΄ μλ κ²½μ° res++μ ν΅ν΄μ νμ ν΄λΉνμ§ μλ κ²½μ°λ₯Ό 체ν¬νλ€.
#include <bits/stdc++.h>
using namespace std;
int vis[100005];
int students[100005];
int n;
void cycle(int x){
int cur = x;
while(true){
vis[cur] = x;
cur = students[cur];
if(vis[cur] == x){
while(vis[cur] != -1){
vis[cur] = -1;
cur = students[cur];
}
return;
}
else if(vis[cur] != 0) return;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while(T--){
cin >> n;
fill(vis, vis+n+1, 0);
for(int i=1; i<=n; i++){
cin >> students[i];
}
int res = 0;
for(int i=1; i<=n; i++){
if(vis[i] == 0) cycle(i);
}
for(int i=1; i<=n; i++){
if(vis[i] != -1) res++;
}
cout << res << '\n';
}
return 0;
}