拓扑排序
给一个有向无环图排序
每次删除一个入度边个数为 0 的点,并刷新其他点的出度边个数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 #include <bits/stdc++.h> using namespace std;#define ll long long const int maxn=2e4 +10 ;#define p 80112002 int n,m;vector<int >se[maxn]; int in[maxn],out[maxn];queue<int >line; ll dp[maxn]; int main () { cin>>n>>m; for (int i=1 ;i<=m;++i) { int a,b; cin>>a>>b; se[b].push_back (a); ++in[a]; ++out[b]; } for (int i=1 ;i<=n;++i) { if (!in[i]) { dp[i] = 1 ; line.push (i); } } while (!line.empty ()) { int now = line.front (); line.pop (); for (int i=0 ;i<se[now].size ();++i) { int next = se[now][i]; --in[next]; dp[next] = (dp[now] + dp[next])%p; if (!in[next]) { line.push (next); } } } ll sum=0 ; for (int i=1 ;i<=n;++i) { if (!out[i]) { sum = (sum+dp[i])%p; } } cout<<sum<<endl; }