• 洛谷P3244 [HNOI2015]落忆枫音


    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<queue>
    #define MAXN 100000+10
    #define MOD 1000000007
    #define ll long long
    #define pb push_back
    using namespace std;
    int n,m,s,t;
    vector<int> G[MAXN];
    int de[MAXN],De[MAXN];
    ll inv[MAXN<<1],f[MAXN],ans=1;
    void init(){
        scanf("%d%d%d%d",&n,&m,&s,&t);
        for(int i=1;i<=m;i++){
            int x,y;scanf("%d%d",&x,&y);
            G[x].pb(y);
            de[y]++,De[y]++;
        }
        De[t]++;
        int i;
        for(inv[1]=1,i=2;i<=m;i++){
            inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;
        }
        for(i=2;i<=n;i++){
            (ans*=De[i])%=MOD;
        }
        f[t]=ans;
    }
    void TopoSort(){
        queue<int> q;
        for(int i=1;i<=n;i++){
            if(!de[i])q.push(i);
        }
        while(!q.empty()){
            int x=q.front();q.pop();
            (f[x]*=inv[De[x]])%=MOD;
            for(int i=0;i<G[x].size();i++){
                int y=G[x][i];
                (f[y]+=f[x])%=MOD;
                if(!(--de[y])){
                    q.push(y);
                }
            }
        }
    }
    void solve(){
        if(t==1){
            printf("%lld",ans);    
            return;
        }
        TopoSort();
        printf("%lld",(ans-f[s]+MOD)%MOD);
    }
    int main()
    {
    //    freopen("data.in","r",stdin);
        init();
        solve();
        return 0;
    }
  • 相关阅读:
    Sunnypig闯三角关
    送给圣诞夜的贺卡
    uva 1592(NEERC 2009 STL)
    uva 297(传递闭包 WF 1996)
    hdu 4190(二分)
    uva 3592 (MST, kruskal)
    uva 11997 (基础数据结构)
    hdu 2680 (Dijkstra)
    hdu 4568(状态压缩dp)
    hdu 4582 (树上的贪心)
  • 原文地址:https://www.cnblogs.com/w-h-h/p/8069185.html
Copyright © 2020-2023  润新知