求助悬关过不了
查看原帖
求助悬关过不了
745358
ChenZQ楼主2024/7/2 21:55
#include <bits/stdc++.h>
using namespace std;

const int N = 200010;
int h[N],e[N],ne[N],idx;
int h1[N],e1[N],n1[N],id;
void add1(int a,int b)
{
	e1[id]=b,n1[id]=h1[a],h1[a]=id++;
}
int n,m,s;
int times=1;
int color[N];
int dfn[N],low[N];
bool vis[N];
int cc=0;
void add(int a,int b)
{
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int flag[5010][5010];
stack<int> stk;
void dfs(int u,int f)
{
	vis[u]=1;
	dfn[u]=times,low[u]=times++;
	stk.push(u); 
	for(int i=h[u];i!=-1;i=ne[i])
	{
		if(!dfn[e[i]])
		{
			dfs(e[i],u);
			low[u]=min(low[u],low[e[i]]);
		}
		else if(vis[e[i]])low[u]=min(low[u],dfn[e[i]]);
	}
	if(low[u]==dfn[u])
	{
		int x;
		cc++;
		do
		{
			x=stk.top();stk.pop();
			color[x]=cc;
			vis[x]=0;
		}while(x!=u);
	}
}
int x[5010],y[5010];
int rd[5010];
bool ff[5010];
void ds(int u)
{
	ff[u]=1;
	for(int i=h1[u];i!=-1;i=n1[i])
	{
		if(!ff[e[i]]) ds(e[i]);
	}
}
int main()
{
	scanf("%d%d%d",&n,&m,&s);
	memset(h,-1,sizeof h);
	for(int i=1;i<=m;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		add(a,b);
		x[i]=a,y[i]=b;
	}
	for(int i=1;i<=n;i++)
	{
		if(!color[i]) dfs(i,0);
	}
	memset(h1,-1,sizeof h1);
	for(int i=1;i<=m;i++)
	{
		int a=color[x[i]],b=color[y[i]];
		if(!flag[a][b])
		{
			flag[a][b]=1;
			rd[b]++;
			add1(a,b);
		}
	}
	ds(s);
	int ans=0;
	for(int i=1;i<=cc;i++)
	{
		if(!ff[i] && !rd[i]) ans++;
	}
	cout<<ans;
}
2024/7/2 21:55
加载中...