求助
查看原帖
求助
1398449
HansonWang楼主2025/7/19 14:40

虽然已经用并查集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;
}
2025/7/19 14:40
加载中...