# BZOJ1051|HAOI2006受欢迎的牛|强连通分量

Description

Input

Output

Sample Input
3 3
1 2
2 1
2 3
Sample Output
1【数据范围】
10%的数据N<=20, M<=50
30%的数据N<=1000,M<=20000
70%的数据N<=5000,M<=50000
100%的数据N<=10000,M<=50000

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

int n,m;
int tot=0,cnt=0,top=0;
struct node{
int to,next;
}e[50001],d[50001];

int dfn[10001],low[10001],q[10001];
int scc=0,h[10001],belong[10001],hav[10001];//scc是强连通分量的个数
bool vis[10001],inq[10001];
int ans=0;

void dfs(int a)
{
int now;
inq[a]=vis[a]=1;
low[a]=dfn[a]=++cnt;
q[++top]=a;
while(c)
{
if (!vis[e[c].to])
{
dfs(e[c].to);
low[a]=min(low[a],low[e[c].to]);
}
else if (inq[e[c].to]) low[a]=min(low[a],dfn[e[c].to]);
c=e[c].next;
}
if (low[a]==dfn[a])
{
scc++;
while (now!=a)
{
now=q[top--];
inq[now]=0;
belong[now]=scc;
++hav[scc];
}
}
}

void rebuild()
{
cnt=0;
for (int i=1; i<=n; i++)
{
while (c)
{
if (belong[e[c].to]!=belong[i])
{
d[++cnt].to=belong[e[c].to];
d[cnt].next=h[i];
h[i]=cnt;
}
c=d[c].next;
}
}
}

void work()
{
for (int i=1; i<=scc; i++)
if (!h[i])
{
if (ans)
{
ans=0; return;
}
else ans=hav[i];
if (i==1) cout << hav[i]<< endl;
}

}

void tarjan()
{
for (int i=1; i<=n; i++) if (!vis[i]) dfs(i);
rebuild();
}

int main()
{

cin >> n >> m;
for (int i=1; i<=m; i++)
{
int x,y,z;
cin >> x >> y;
}