洛谷 P4017 最大食物链计数(DAG上的dp)

传送门


解题思路

显然的用到类似树形dp的思想,在一个有向无环图上做dp。

状态转移方程就是dp[v]加起来。

AC代码

//其实不用long long也可以

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstdio>
 5 #include<cstring>
 6 using namespace std;
 7 const int mod=80112002;
 8 const int maxn=500005;
 9 int n,m,p[5005],cnt,ru[5005],chu[5005];
10 long long dp[5005],ans;
11 struct node{
12     int v,next;
13 }e[maxn];
14 void insert(int u,int v){
15     cnt++;
16     e[cnt].next=p[u];
17     e[cnt].v=v;
18     p[u]=cnt;
19 }
20 void dfs(int u){
21     if(dp[u]) return;
22     for(int i=p[u];i!=-1;i=e[i].next){
23         int v=e[i].v;
24         dfs(v);
25         dp[u]=(dp[v]+dp[u])%mod;
26     }
27 }
28 int main()
29 {
30     memset(p,-1,sizeof(p));
31     cin>>n>>m;
32     for(int i=1;i<=m;i++){
33         int u,v;
34         scanf("%d%d",&u,&v);
35         insert(u,v);
36         ru[v]++;
37         chu[u]++;
38     }
39     for(int i=1;i<=n;i++){
40         if(chu[i]==0){
41             dp[i]=1;
42         }
43     }
44     for(int i=1;i<=n;i++){
45         if(ru[i]==0){
46             dfs(i);
47             ans=(ans+dp[i])%mod;
48         }
49     }
50     cout<<ans; 
51     return 0;
52 }

 

posted @ 2020-10-15 00:07  尹昱钦  阅读(168)  评论(0编辑  收藏  举报