P4017 最大食物链计数
建图,食物链从 入度为0的点 到 出度为0的点 为一条完整的食物链
在DAG上拓扑排序dp,每个结点 有多少种方式 从入度为0的点到达表示为 f[v]+=f[u] u->v
当遍历到的点出度为0就将 f[v] 的值加入答案
#include<iostream>
#include<cstring>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
int n,m;
const int mod=80112002;
vector<int> son[100010];
int d[100010];
int out[100010];
long long f[100010];
long long ans=0;
void bfs()
{
queue<int> q;
for(int i=1;i<=n;i++)
if(d[i]==0)
{
q.push(i);
f[i]=1;
}
while(!q.empty())
{
int u=q.front();q.pop();
for(auto v:son[u])
{
f[v]=(f[v]+f[u])%mod;
if(--d[v]==0)
{
q.push(v);
if(out[v]==0)
ans=(ans+f[v])%mod;
}
}
}
cout<<(ans%mod)<<endl;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y; cin>>x>>y;
son[x].push_back(y);
d[y]++,out[x]++;
}
bfs();
return 0;
}
本文来自博客园,作者:magicat,转载请注明原文链接:https://www.cnblogs.com/magicat/p/16535206.html