洛谷经典题目:
P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P4017
模板一(类似于广搜,平常大多用的都是广搜):
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int mod=80112002;
int n,m;
int dp[5001];
int indegree[5001],oudegree[5001];
vector<int> g[5001];
void toposort(){
queue<int> q;
for(int u=1;u<=n;u++)
if(!indegree[u]){
q.push(u);
dp[u]=1;
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
indegree[v]--;
if(!indegree[v])
q.push(v);
dp[v]+=dp[u];
dp[v]%=mod;
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
indegree[v]++;
oudegree[u]++;
}
toposort();
long long ans=0;
for(int u=1;u<=n;u++)
if(!oudegree[u])
ans=(ans+dp[u])%mod;
cout<<ans;
}
模板二(在竞赛入门经典书里面学到的,深搜):
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int mod=80112002;
int n,m,t;
int dp[5001];
int vis[5001],indegree[5001],oudegree[5001];
vector<int> g[5001];
bool dfs(int u){
vis[u]=-1;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(vis[v]<0) return false;
if(!vis[v]&&!dfs(v)) return false;
dp[u]=(dp[v]+dp[u])%mod;
}
vis[u]=1;
return true;
}
bool toposort(){
t=n;
for(int u=1;u<=n;u++) if(!vis[u]){
if(!dfs(u)) return false;
}
return true;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
indegree[v]++;
oudegree[u]++;
}
for(int u=1;u<=n;u++)
if(!oudegree[u]) dp[u]=1;
toposort();
long long ans=0;
for(int u=1;u<=n;u++)
if(!indegree[u])
ans=(ans+dp[u])%mod;
cout<<ans;
}