/*
* @Description: To iterate is human, to recurse divine.
* @Autor: Recursion
* @Date: 2022-03-26 11:05:42
* @LastEditTime: 2022-03-26 12:22:30
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
int n,m,head[N],cnt,in[N],out[N],f[N],ans;
struct node{
int to;
int next;
}edge[N];
void add(int x,int y)
{
edge[++cnt].to = y;
edge[cnt].next = head[x];
head[x] = cnt;
}
int dfs(int x)
{
if(f[x]) return f[x];
int ans = 0;
if(out[x] == 0) return 1;
for(int i = head[x];i != 0;i = edge[i].next)
ans += dfs(edge[i].to);
f[x] = ans;
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for(int i = 1;i <= m;i ++){
int x,y;
cin >> x >> y;
out[x]++;
in[y]++;
add(x,y);
}
// for(int i = 1;i <= n;i ++){
// cout << i << endl;
// for(int j = head[i];j != 0;j = edge[j].next)
// cout << i << " " << edge[j].to << " ";
// cout << endl;
// }
for(int i = 1;i <= n;i ++)
if(in[i] == 0&&out[i] != 0)
ans += dfs(i);
cout << ans << endl;
}
P3183 [HAOI2016]食物链
最新推荐文章于 2024-09-25 13:54:13 发布