48分 大红大紫 求调
查看原帖
48分 大红大紫 求调
1205369
qinzixu楼主2024/8/7 19:56
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int n,m;
vector<int>a[N];
int dfn[N],low[N],to[N];
void add(int m){
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		a[x].push_back(y);
	}
}

int e[N],in[N],f[N],gs[N],num=0,cnt=0;
//f[i]点i在第几个强连通块中;gs[j]第j号强连通块有几个数; 
stack<int>q;
void tarjan(int u)//从u点开始; 
{
	low[u]=dfn[u]=++cnt;
	in[u]=1;
	q.push(u);
	for(int i=e[u];i<a[u].size();i=e[u])
	{
		e[u]++;
		int v=a[u][e[i]];
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(in[v])low[u]=min(low[u],dfn[v]);
		
	}
	if(dfn[u]==low[u]){
		++num;
		while(q.top()!=u){
			int v=q.top();
			f[v]=num;
			gs[num]++;
			in[v]=0;
			q.pop();
		}
		int v=q.top();
		f[v]=num;
		gs[num]++;
		in[v]=0;
		q.pop();
	}
}

int out()
{
	if(num==1){
		return n;
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<a[i].size();j++)
		{
			if(f[i]==f[a[i][j]])continue;
			to[f[i]]++;
		}
	}
	int f0=0,f1;
	for(int i=1;i<=num;i++)
	{
		if(to[i]==0)f0++,f1=i;
	}
	if(f0==1)return gs[f1];
	else return 0;
}

signed main()
{
	cin>>n>>m;
	add(m);
	for(int i=1;i<=n;i++)
	{
		if(dfn[i]==0)tarjan(i);
	}
	cout<<out();
	return 0;
}
2024/8/7 19:56
加载中...