rt,代码如下,拍了8000组没拍出来(捂脸)。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define f(i,j,k) for(int i=j;i<=k;++i)
#define g(i,j,k) for(int i=j;i>=k;--i)
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
const int N=1e5+10,mod=1e9+7;
void gtmin(int a,int &b){if(b>a)b=a;}
int dfn[N],low[N],dfncnt,scc[N],sc,sz[N],cd[N];//深搜节点被搜索次序,在u子树中能回溯到的最早的栈中节点
stack<int>s;
vector<int>g[N];
bool flag[N];//记录是否在栈中
void tarjan(int u)
{
low[u]=dfn[u]=++dfncnt;
s.push(u),flag[u]=1;
for(auto v:g[u])
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(flag[v])low[u]=min(low[u],dfn[v]);
if(dfn[u]==low[u])
{
/*sc++;//强连通分量+1
while(!s.empty())
{
scc[s.top()]=sc;
flag[s.top()]=0;
sz[sc]++;
s.pop();
}*/
scc[u]=++sc;
++sz[sc];
while(!s.empty()&&s.top()!=u)
{
++sz[sc];
scc[s.top()]=sc;
s.pop();
}
if(!s.empty())s.pop();
}
return ;
}
int n,m;
void debug()
{
cout<<"Debug:\n";
f(i,1,n)
cout<<scc[i]<<' '<<sz[i]<<'\n';
cout<<'\n';
return;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
f(i,1,m)
{
int x,y;
cin>>x>>y;
g[y].pb(x);
}
f(i,1,n)if(!dfn[i])tarjan(i);
f(u,1,n)for(auto v:g[u])if(scc[v]!=scc[u])cd[scc[v]]++;
int ansi=0;
f(i,1,sc)
if(!cd[i]){
if(ansi){cout<<0;return 0;}
ansi=i;
}
//debug();
cout<<sz[ansi];
return 0;
}