92pts 求助
查看原帖
92pts 求助
1013142
Chizuru_Ichinose楼主2024/4/19 20:11

tarjan 板子 TLE on #10

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e4+4;
int n,m;
int dfn[maxn],low[maxn],tot;
int head[maxn],cnt;
int vis[maxn];
int sum[maxn];
int st[maxn],top;
int col[maxn];
struct node
{
	int to;
	int next;
}edge[maxn];
void add(int u,int v)
{
	edge[cnt].to=v;
	edge[cnt].next=head[u];
	head[u]=cnt++;
}
void tarjan(int index)
{
	dfn[index]=low[index]=++tot;
	vis[index]=1;
	st[++top]=index;
	for(int i=head[index];i!=-1;i=edge[i].next)
	{
		int to=edge[i].to;
		if(!dfn[to])
		{
			tarjan(to);
			low[index]=min(low[index],low[to]);
		}
		else if(vis[to])
		{
			low[index]=min(low[index],dfn[to]);
		}
	}
	if(low[index]==dfn[index])
	{
		cnt++;
		//int temp=0;
		while(st[top+1]!=index)
		{
			vis[st[top]]=0;
			col[st[top]]=cnt;
			top--;
			sum[cnt]++;
		}
	}
}
int main()
{	
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	memset(head,-1,sizeof(head));
	cin>>n>>m;
	for(int i=1,in,to;i<=m;i++)
	{
		cin>>in>>to;
		add(in,to);
	}
	for(int i=1;i<=n;i++)
	{
		if(!vis[i]) tarjan(i);
	}
	int ans=0;
	for(int i=1;i<=cnt;i++)
	{
		if(sum[i]>1) ans++;
	}
	cout<<ans<<endl;
	
	
	return 0;
}
2024/4/19 20:11
加载中...