#include<bits/stdc++.h>
#define endl '\n'
#define MIN(a,b,c) min(min(a,b),c)
#define MAX(a,b,c) max(max(a,b),c)
#define ri register int
#define int long long
#define fixedset(a) fixed << setprecision(a)
#define ls(x) x<<1
#define rs(x) x<<1|1
#define MAXN 9.2211e18
#define inf 2114514
#define mf 5011
#define sf 1011
using namespace std;
mt19937_64 randint{std::chrono::steady_clock::now().time_since_epoch().count()};
int n,m,x,y,ans,out[inf];
vector<int> orgedge[inf],newedge[inf];
int sc,head,index_,dfncnt,dfn[inf],low[inf],s[inf],scc[inf];
bool in_stack[inf],Hash[inf];
queue<int> q;
void TarjanSCC(int u){
dfn[u]=low[u]=++dfncnt,s[++head]=u,in_stack[u]=true;
for(auto v:orgedge[u]){
if(!dfn[v]){
TarjanSCC(v);
low[u]=min(low[u],low[v]);
}else if(in_stack[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
sc++;
while(s[head]!=u){
scc[s[head]]=sc;
in_stack[s[head--]]=false;
}
scc[s[head]]=sc;
in_stack[s[head]--]=false;
}
return;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
//cout << "AA" << endl; //甚至连这个都不输出
cin >> n >> m;
for(ri i=1;i<=m;i++){
cin >> x >> y;
orgedge[x].push_back(y);
}
for(ri i=1;i<=n;i++) if(!dfn[i]){
TarjanSCC(i);
}
for(ri u=1;u<=n;u++) for(auto v:newedge[u]){
if(!Hash[(int)(scc[u]*pow(sc,2)+scc[v])]){
Hash[(int)(scc[u]*pow(sc,2)+scc[v])]=true,index_++;
newedge[scc[u]].push_back(scc[v]);
out[scc[u]]++;
}
}
for(ri i=1;i<=sc;i++) if(!out[i]){
for(ri j=1;j<=n;i++) if(scc[j]==i) ans++;
}
cout << ans << endl;
return 0;
}
求解答