#include<iostream>
#include<cstdio>
#define N 10001
using namespace std;
struct edge{
int to,next;
}e[50001],d[50001];
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int head[N],n,m,cnt,top,dfn[N],low[N],q[N],scc,h[N],belong[N],hav[N],ans;
bool vis[N],inq[N];
void dfs(int x){
int now,i=head[x];
vis[x]=inq[x]=1;
low[x]=dfn[x]=++cnt;
q[++top]=x;
while(i){
if(!vis[e[i].to]){
dfs(e[i].to);
low[x]=min(low[x],low[e[i].to]);
}
else if(inq[e[i].to])low[x]=min(low[x],dfn[e[i].to]);
i=e[i].next;
}
if(low[x]==dfn[x]){
scc++;
while(now!=x){
now=q[top--];
inq[now]=0;
belong[now]=scc;
++hav[scc];
}
}
}
void rebuild(){
cnt=0;
for(int i=1;i<=n;i++){
int c=head[i];
while(c){
if(belong[i]!=belong[e[c].to]){
d[++cnt].to=belong[e[c].to];
d[cnt].next=h[belong[i]];
h[belong[i]]=cnt;
}
c=e[c].next;
}
}
}
void tarjan(){
for(int i=1;i<=n;i++)
if(!vis[i])dfs(i);
rebuild();
}
void work(){
for(int i=1;i<=scc;i++)
if(!h[i])
if(ans){ans=0;return;}
else ans=hav[i];
}
int main(){
n=read();m=read();
for(int i=1;i<=m;i++){
int a=read(),b=read();
e[i].to=b;e[i].next=head[a];head[a]=i;
}
tarjan();work();
printf("%d",ans);
return 0;
}
1051: [HAOI2006]受欢迎的牛
最新推荐文章于 2018-12-05 21:28:00 发布