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;
}

 

posted @ 2020-05-16 10:41  mohari  阅读(155)  评论(0编辑  收藏  举报