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;
    }
  • 相关阅读:
    nginx日志
    silverlight 双击事件
    Silverlight button 图片切换样式
    Caliburn.Micro学习笔记(一)----引导类和命名匹配规则
    关闭Outlook时最小化 dll
    wpf键盘记录器
    WPF之TreeList的实现方法(一)
    精典算法之详解 河内之塔
    精典算法之二分查找法
    指针数组和数组指针
  • 原文地址:https://www.cnblogs.com/mohari/p/12899311.html
Copyright © 2011-2022 走看看