#include <bits/stdc++.h>
using namespace std;
struct node{
int u,v,nxt;
}e[100010];
int cnt = 0;
int n;
int a[100010];
int hd[100010];
void add_edge(int u,int v){
e[++cnt] = node{u,v,hd[u]};
hd[u] = cnt;
}
bool vis[100010];
bool ans[100010];
bool submit = 0;
int main(){
if(submit){
freope\
n("shuffle.in","r",stdin);
freope\
n("shuffle.out","w",stdout);
}
cin >> n;
for(int i = 1;i <= n;i++) cin >> a[i];
for(int i = 1;i <= n;i++){
add_edge(i,a[i]);
}
for(int i = 1;i <= n;i++){
if(ans[i]) continue;
memset(vis,0,sizeof(vis));
int u = i,v = 0;
while(hd[u] != 0){
v = e[hd[u]].v;
vis[u] = 1;
if(!vis[v]){
u = v;
}else break;
}
if(v == i){
ans[i] = 1;
}
}
int cnt = 0;
for(int i = 1;i <= n;i++){
if(ans[i]) cnt++;
}
cout << cnt << endl;
return 0;
}
使它在如
1 2
2 3
3 4
...
n-1 n
n 1
这种图达到 O(n) 的复杂度?