虽然已经用并查集AC了,但是还是想知道为什么用tarjan最后一个点会MLE
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
struct edge{
int next,to;
}e[N];
struct node{
int u,v;
}a[N];
stack<int> stk;
int n,x,tot,cnt,pos,cnt2,low[N],ans,dfn[N],vis[N],head[N],rd[N],fa[N];
void add(int u,int v){
e[++tot].next=head[u];
e[tot].to=v;
head[u]=tot;
}
void tarjan(int x){
low[x]=dfn[x]=++pos;
vis[x]=1;
stk.push(x);
for(int i=head[x];i;i=e[i].next){
int it=e[i].to;
if(!dfn[it]){
tarjan(it);
low[x]=min(low[x],low[it]);
}
if(vis[it]){
low[x]=min(low[x],dfn[it]);
}
}
int now;
if(low[x]==dfn[x]){
cnt++;
do{
now=stk.top();
stk.pop();
vis[now]=0;
fa[now]=cnt;
}while(low[now]!=dfn[now]&&!stk.empty());
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
fa[i]=i;
a[++cnt2].u=x;
a[cnt2].v=i;
add(x,i);
}
for(int i=1;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
for(int i=1;i<=cnt2;i++){
if(fa[a[i].u]!=fa[a[i].v]){
rd[fa[a[i].v]]++;
}
}
for(int i=1;i<=cnt;i++){
if(rd[i]==0) ans++;
}
cout<<ans;
return 0;
}