描述

TsyD學習了生物的生態環境那一張後,老師留了一項作業,就是給一張食物網,求所有食物鏈的總數。(從最低營養級生物(它不能吃任何其他的生物)開始到最高營養級(它不能被任何其他生物吃) 叫做一條食物鏈)
輸入保證所有的生物之間都有直接或間接的生存關係

輸入格式

第一行 N,M 分別表示有N(N<=50000)個生物,M(M<=100000)個吃的關係
接下來M行 每行有兩個值a,b 分別 表示b吃a (編號從1開始)

輸出格式

食物鏈的總數 MOD 11129 的值

測試樣例1

輸入

3 3 
1 2 
2 3 
1 3

輸出

2

備註

樣例解釋:
兩條食物鏈分別為 1->3
 1->2->3
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = ,mod = ;
vector<int> g[maxn];
int n,m,f[maxn],topo[maxn],cnt,ans;
bool vis[maxn],ind[maxn];
void input(){
scanf("%d%d",&n,&m);
int a,b;
for(int i = ;i <= m;i++){
scanf("%d%d",&a,&b);
g[a].push_back(b);
ind[b] = true;
}
}
void topo_dfs(int x){
vis[x] = true;
for(int i = ;i < g[x].size();i++){
if(!vis[g[x][i]]) topo_dfs(g[x][i]);
}
topo[cnt--] = x;
}
void topo_sort(){
cnt = n;
for(int i = ;i <= n;i++){
if(!vis[i]) topo_dfs(i);
}
}
void dfs(int x){
if(!g[x].size()){
f[x] = ;
return;
}
for(int i = ;i < g[x].size();i++){
if(!f[g[x][i]]) dfs(g[x][i]);
f[x] = (f[x] + f[g[x][i]]) % mod;
}
}
void dp(){
for(int i = ;i <= n;i++){
if(!f[topo[i]]) dfs(topo[i]);
if(!ind[topo[i]]) ans = (ans + f[topo[i]]) % mod;
}
cout<<ans;
}
int main(){
input();
topo_sort();
dp();
return ;
}