好久没写tarjan了,复习一发
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef long long LL;
inline LL read()
{
LL x=0;bool f=0;char c=getchar();
for (;c<'0'||c>'9';c=getchar()) f=c=='-'?1:0;
for (;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';
return f?-x:x;
}
const int N=10010,M=50010;
int n,m,bl[N],dfn[N],low[N],stk[N],st=0,sz[N],out[N],ans=0,
scc=0,clk=0,ll=1,frm[M],to[M],next[M],head[N];
inline void adde(int u,int v)
{to[++ll]=v;frm[ll]=u;next[ll]=head[u];head[u]=ll;}
void dfs(int u)
{
stk[++st]=u;
dfn[u]=low[u]=++clk;
for (int i=head[u],v;i;i=next[i])
{
if (bl[v=to[i]]) continue;
if (dfn[v]) low[u]=min(low[u],dfn[v]);
else dfs(v),low[u]=min(low[u],low[v]);
}
if (low[u]==dfn[u])
{
bl[u]=++scc;sz[scc]=1;
while (st&&u!=stk[st])
bl[stk[st--]]=scc,sz[scc]++;
st--;
}
}
int main()
{
n=read();m=read();
for (int i=1,u,v;i<=m;i++)
u=read(),v=read(),adde(u,v);
for (int i=1;i<=n;i++)
if (!bl[i]) dfs(i);
for (int i=2;i<=ll;i++)
if (bl[frm[i]]!=bl[to[i]]) out[bl[frm[i]]]++;
for (int i=1;i<=scc;i++)
if (!out[i]) ans=ans?-1:i;
if (~ans) ans=sz[ans];
else ans=0;
printf("%d\n",ans);
return 0;
}