洛谷P4017 最大食物链计数 题解
本题做法
- 拓扑排序。
思路
本题可以利用拓扑排序,每次找到入度为 0 的生物,然后将吃它的生物的路径计数加上它本身的计数,直到所有生物都被遍历到为止。最后输出答案即可。
代码
#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int N=5005;
const int M=5e5+5;
const ll P=80112002;
struct node{
int in;
int out;
ll num;
vector<int> to;
} a[N];
int n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
a[x].out++;
a[y].in++;
a[x].to.push_back(y);
}
queue<node> q;
int query[N]={0},cnt=0;
for(int i=1;i<=n;i++){
if(a[i].in==0) {
a[i].num=1;
q.push(a[i]);
}
if(a[i].out==0) query[++cnt]=i;
}
while(!q.empty()){
node cur=q.front();
q.pop();
for(int i=0;i<cur.out;i++){
a[cur.to[i]].in--;
a[cur.to[i]].num=(a[cur.to[i]].num+cur.num)%P;
if(a[cur.to[i]].in==0){
q.push(a[cur.to[i]]);
}
}
}
ll sum=0;
for(int i=1;i<=cnt;i++){
sum=(sum+a[query[i]].num)%P;
}
cout<<sum<<endl;
return 0;
}

浙公网安备 33010602011771号