代码:
#include<bits/stdc++.h>
using namespace std;
int n, m, u[500005], v[500005], out[100005];
int tot, head[10005];
int dfn[100005], low[100005], stk[100005], top, ind, cnt[100005], pos, color[100005];
bool vis[100005];
struct node{
int to, next;
}edges[5000005];
void add(int x, int y){
tot++;
edges[tot].to = y;
edges[tot].next = head[x];
head[x] = tot;
}
void tarjan(int x){
stk[++top] = x;
dfn[x] = low[x] = ++ind;
vis[x] = true;
for(int i = head[x]; i; i = edges[i].next){
int v = edges[i].to;
if(!dfn[v]){
tarjan(v);
low[x] = min(low[x], low[v]);
}
else if(vis[v]){
low[x] = min(low[x], dfn[v]);
}
}
if(dfn[x] == low[x]){
pos++;
while(stk[top + 1] != x){
color[stk[top]] = pos;
cnt[pos]++;
vis[stk[top--]] = false;
}
}
}
void Solve(){
cin >> n >> m;
for(int i = 1; i <= m; i++){
cin >> u[i] >> v[i];
if(u[i] == v[i]){
continue;
}
add(u[i], v[i]);
}
for(int i = 1; i <= n; i++){
if(!dfn[i]){
tarjan(i);
}
}
for(int i = 1; i <= n; i++){
for(int j = head[i]; j; j = edges[j].next){
int v = edges[j].to;
if(color[i] != color[v]){
out[color[v]]++;
}
}
}
int ans = 0;
for(int i = 1; i <= pos; i++){
if(!out[i]){
ans++;
}
}
cout << ans;
}
int main(){
#ifdef debug
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#endif
Solve();
return 0;
}