P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
拓扑排序板子题。
由于mod暗示此题用bfs会出现超过80112002的情况,不能用bfs(TLE)
由于没有自环,可以用拓扑排序。
坑点:所有初始入度为0的点都要赋初值,所有出度为0的点都要加答案
代码:
#include<iostream>
#define ll long long
using namespace std;
ll p[5001],q[5001],dp[5001],mod=80112002;
bool s[5001][5001];
int main(){
ll n,m,i,j,k,a,b,su=0;
cin>>n>>m;
while(m--){
cin>>a>>b;
s[a][b]=1;
p[b]++;
q[a]++;
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++) if(p[j]==0) break;
k=j;
if(dp[k]==0) dp[k]=1;
p[k]=-1;
for(j=1;j<=n;j++){
if(s[k][j]==1){
dp[j]+=dp[k];
dp[j]%=mod;
p[j]--;
}
}
}
for(i=1;i<=n;i++) if(q[i]==0) su+=dp[i],su%=mod;
cout<<su;
return 0;
}