zoukankan      html  css  js  c++  java
  • P4017 最大食物链计数(拓扑排序)

    题目是找生产者到最高级消费者的路线有几条。

    其实是找入度为0的点到出度为0的路径方式有几种。

    预处理入度和出度,拓扑排序,把出度为0的点的路线累加。

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<vector>
    #include<queue>
    #include<map>
    #include<string.h>
    using namespace std;
    typedef long long int ll;
    int n,k,m,b,t,t1,t2,t3,maxx=0;
    const int maxn=1e5+5;
    const int mod= 80112002;
    vector<int >v[maxn];
    vector<int>a(maxn);
    queue<int>q;
    int indge[maxn];
    int outdge[maxn];
    void topsort()
    {
        int num=0;
        while(!q.empty())q.pop();
        for(int i=1;i<=n;i++){
            if(!indge[i]){
                a[i]=1;
                q.push(i);
            }
        }
        while(!q.empty()){
            int tot=q.front();
            q.pop();
            num++;
            for(int i=0;i<v[tot].size();i++){
                if(--indge[v[tot][i]]==0){
                    q.push(v[tot][i]);
    
                }
                a[v[tot][i]]=(a[v[tot][i]]+a[tot])%mod;
            }
        }
    }
    int main()
    {
            scanf("%d%d",&n,&m);
            for(int i=0;i<maxn;i++)v[i].clear();a.clear();
            memset(indge,0,sizeof(indge));
            memset(outdge,0,sizeof(outdge));
            for(int j=0;j<m;j++){
                //cin>>t1>>t2>>t3;
                scanf("%d%d",&t1,&t2);
                v[t1].push_back(t2);
                indge[t2]++;
                outdge[t1]++;
            }
            topsort();
            int ans=0;
            for(int i=1;i<=n;i++){
                if(outdge[i]==0)ans=(ans+a[i])%mod;
            }
            cout<<ans<<endl;
            return 0;
    }
  • 相关阅读:
    HTML基础
    Java基础05-计算机单位
    Java基础04-运算符
    Java基础03-数据类型
    Java基础02-变量
    Java基础01-HelloWorld
    MarkDown基本使用
    短视频学习
    c# as 总结
    在C#中使用Nullable类型和 tuple类
  • 原文地址:https://www.cnblogs.com/mohari/p/12899311.html
Copyright © 2011-2022 走看看