记录编号 543287 评测结果 AAAAAAAAAAA
题目名称 [HAOI 2006]受欢迎的牛 最终得分 100
用户昵称 Gravatarleon 是否通过 通过
代码语言 C++ 运行时间 0.135 s
提交时间 2019-10-04 11:05:44 内存使用 16.52 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int head[50000],f[50000];
int n,m,tot,tt,dfn[50000],low[50000],num[50000],belong[50000],chu[50000],sta[100000],ins[100010],top,ans,cnt,tmp;
struct dd{
	int to,next;
}a[100010];
int find(int x){
	if(f[x]!=x)
	return f[x]=find(f[x]);
	return f[x];
}
void bing(int x1,int x2){
	f[find(x2)]=find(x1);
}
void add(int x,int y)
{
	a[++tot].to=y;
	a[tot].next=head[x];
	head[x]=tot;
}
void tarjan(int x)
{
	dfn[x]=low[x]=++tt;
	sta[++top]=x;
	ins[x]=1;
	for(int i=head[x];i;i=a[i].next)
	    if(!dfn[a[i].to]){
	    	tarjan(a[i].to);
	    	low[x]=min(low[a[i].to],low[x]);
		}
		else if(ins[a[i].to])
		    low[x]=min(dfn[a[i].to],low[x]);
	if(dfn[x]==low[x]){
		cnt++;
		do{
			tmp=sta[top--];
			ins[tmp]=0;
			belong[tmp]=cnt;
			num[cnt]++;
		}while(tmp!=x);
	}
}

int main(){
   freopen("cow.in","r",stdin);
   freopen("cow.out","w",stdout);
   int xx,yy,sum;
    cin>>n>>m;
    sum=n;
    for(int i=1;i<=n+1;i++){
		f[i]=i;
    }
    for(int i=1;i<=m;i++){
		cin>>xx>>yy;
		if(find(xx)!=find(yy)){
		bing(xx,yy); 
		sum--;}
		add(xx,yy);
    }
    if(sum!=1){
		cout<<0;
		return 0;
    }
    for(int i=1;i<=n;i++){
		if(dfn[i]==0)tarjan(i);
    }
    for(int i=1;i<=n;i++){
		for(int j=head[i];j;j=a[j].next){
			int to=a[j].to;
			if(belong[i]!=belong[to]){
				chu[belong[i]]++;
			}
		}
    }
    if(cnt==1){
		cout<<n;
		return 0;
    }
    
    for(int i=1;i<=cnt;i++){
		if(chu[i]==0){
		ans+=num[i];
		}
    }
    cout<<ans;
   return 0;

}