就是一个tarjan
#include<iostream>
#include<stack>
#include<cstdio>
using namespace std;
struct edge
{
int to,nxt,from;
}e[];
int Color,cnt=,n,m,tot,Time,p,ans;
stack<int>s;
int color[],dfn[],low[],in[],g[];
inline void link(int u,int v)
{
e[++cnt].nxt=g[u];
e[cnt].from=u;
g[u]=cnt;
e[cnt].to=v;
}
inline int read()
{
int x=,f=; char c=getchar();
while(c<''||c>''){if(c=='-') f=-;c=getchar();}
while(c>=''&&c<=''){x*=;x+=c-'';c=getchar();}
return x*f;
}
inline int Min(int x,int y)
{
return x<y?x:y;
}
void tarjan(int u)
{
dfn[u]=low[u]=++Time;
s.push(u);
for(int i=g[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(!dfn[v])
{
tarjan(v);
}
if(dfn[v]!=-) low[u]=Min(low[u],low[v]);
}
if(dfn[u]==low[u])
{
++Color;
while(!s.empty())
{
int x=s.top(); s.pop();
dfn[x]=-;
color[x]=Color;
if(x==u) break;
}
}
}
int main()
{
n=read(); m=read();
for(int i=;i<=m;i++)
{
int u,v; u=read(); v=read();
link(u,v);
}
for(int i=;i<=n;i++)
{
if(!dfn[i]) tarjan(i);
}
for(int i=;i<=cnt;i++)
{
int u=e[i].from,v=e[i].to;
if(color[u]!=color[v]) in[color[u]]++;
}
for(int i=;i<=Color;i++)
{
if(!in[i])
{
tot++;
p=i;
if(tot==)
{
printf("%d",);
return ;
}
}
}
for(int i=;i<=n;i++) if(color[i]==p) ans++;
printf("%d",ans);
return ;
}