拓扑排序原理

#include <bits/stdc++.h>
using namespace std;


const int mod =  100007;
int main()
{
    
    int n,m,t;
    cin>>n>>m>>t;
    unordered_map<int,vector<int> >mp ;
    vector<int> ind(n+1); 
    // vector<int> dfn(n+1); 
    // vector<int> mdfn(n+1); 
    for(int i=0;i<m;i++) {

        int u,v;
        cin>>u>>v;
        mp[u].push_back(v);
        ind[v]++;
    }
    int qx;
    int cnt=0;
    cin>>qx;
    queue<int> q;
    for(int i=1;i<=n;i++)
        if(ind[i]==0)
            q.push(i);
    vector<int> seq; 
    while(q.size()) {
        int x = q.front();q.pop();
        seq.push_back(x);
        for(auto p: mp[x]) {
            ind[p]--;
            if(ind[p]==0)
                q.push(p);
        }
    }
    vector<int> dp(n+1);
    dp[t] = 1;

    for(int i=seq.size()-1;i>=0;i--) {
        int k = seq[i];
        for(auto ne: mp[k]) {
            dp[k] = (dp[k] + dp[ne]) % mod;
        }
    } 
    for(int i=0;i<qx;i++) {
        int s;
        cin>>s;
        //s->t cnt 
        cout << dp[s]<<endl;
    }
    return 0;
}