记录编号 261814 评测结果 AAAAAAAAAA
题目名称 [HAOI 2006]受欢迎的牛 最终得分 100
用户昵称 Gravatar哒哒哒哒哒! 是否通过 通过
代码语言 C++ 运行时间 0.026 s
提交时间 2016-05-18 17:51:22 内存使用 3.08 MiB
显示代码纯文本
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 100010
using namespace std;

int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}

struct edge{
	int to,next;
}e[50010];
int tot,head[maxn],scc_cnt,dfs_cnt;
int low[maxn],sccno[maxn],pre[maxn];
int q[maxn],top;
int num[maxn];
bool vis[maxn];
void edge(int u,int v){
	e[++tot].to=v;
	e[tot].next=head[u];
	head[u]=tot;
}
int dfs(int u){
	pre[u]=low[u]=++dfs_cnt;
	q[++top]=u;
	for(int i=head[u];i;i=e[i].next){
		int to=e[i].to;
		if(!pre[to]){
			dfs(to);low[u]=min(low[u],low[to]);
		}
		else if(!sccno[to])low[u]=min(low[u],low[to]);
	}
	if(pre[u]==low[u]){
		scc_cnt++;
		for(;;){
			int x=q[top];top--;
			sccno[x]=scc_cnt;
			num[scc_cnt]++;
			if(x==u) break;
		}
	}
}

int main()
{
	freopen("cow.in","r",stdin);freopen("cow.out","w",stdout);
	int n=read(),m=read();
	for(int i=1;i<=m;i++){
		int x=read(),y=read();
		edge(x,y);
	}
	for(int i=1;i<=n;i++)if(!pre[i]) dfs(i);
	for(int i=1;i<=n;i++)
		for(int j=head[i];j;j=e[j].next){
			int to=e[j].to;
			if(sccno[i]!=sccno[to]) vis[sccno[i]]=1;
		}
	for(int i=1;i<=scc_cnt;i++)
		if(!vis[i]){
			printf("%d ",num[i]);
			return 0;
		}
	//fclose(stdin);fclose(stdout);
	return 0;
}