洛谷P4017_最大食物链计数_拓扑算法

链接

P4017

题解(AC)

cpp 复制代码
//拓扑序: 从入度为0开始,消除影响,一步一步

#include<bits/stdc++.h>
using namespace std;
const int mod=80112002;
unordered_map<int,vector<int>>graph;//节点的出度指向的节点
vector<int>out,in;//每一个节点的出度,入度数量
int main(){
    //cin
    int n,side_num;
    cin>>n>>side_num;//节点的编号[1,n]
    //初始化out,in的大小
    out.resize(n+1);
    in.resize(n+1);
    for(int i=1;i<=side_num;++i){
        int from,to;
        cin>>from>>to;
        //from-->to
        graph[from].push_back(to);
        in[to]++;
        out[from]++;
    }
   
    //从入读in[]=0的节点开始处理
    queue<int>que;
    vector<int>num(n+1);//num[i]: 从1号节点到编号为i的节点的路径数
    for(int i=1;i<=n;++i)
        if(in[i]==0)num[i]=1,que.push(i);
    //开始拓扑
    while(!que.empty() ){
        int cur=que.front();
        que.pop();
        for(auto &it:graph[cur]){
            in[it]--;
            num[it]=(num[it]+num[cur])%mod;
            if(in[it]==0)que.push(it);
        }
    }
    int res=0;
    //最后只需要统计所有出度out[]=0的节点的路径数即可
    for(int i=1;i<=n;++i){
        if(out[i]==0)res=(res+num[i])%mod;
    }
    cout<<res<<endl;
}