bzoj4562: [Haoi2016]食物链--记忆化搜索

时间:2024-06-25 12:07:56

这道题其实比较水,半个小时AC= =对于我这样的渣渣来说真是极大的鼓舞

题目大意:给出一个有向图,求入度为0的点到出度为0的点一共有多少条路

从入读为零的点进行记忆化搜索,搜到出度为零的点返回1

所有返回值加起来就是答案。

“注意单独的一种孤立生物不算一条食物链。”出题人都这么好心的说了,然而第一次交的时候还是忘了= =结果成为此题第一个WA的人hh

 #include<stdio.h>
 #include<string.h>
 #include<algorithm>
 #define maxn 100010
 using namespace std;
 struct node{
     int from,to,next;
 }e[maxn*];
 int head[maxn],vis[maxn],dp[maxn],ind[maxn],out[maxn];
 int tot,n,m,u,v;

 void insert(int u, int v){
     e[++tot].from=u;
     e[tot].to=v;
     e[tot].next=head[u];
     head[u]=tot;
 }

 int dfs(int x){
     if (vis[x]) return dp[x];
     vis[x]=;
     ){
         dp[x]=;
         ;
     }
     ;
     ; i=e[i].next){
         int v=e[i].to;
         sum+=dfs(v);
     }
     dp[x]=sum;
     return sum;
 }

 int main(){
     scanf("%d%d", &n, &m);
     memset(ind,,sizeof(ind));
     memset(,sizeof(out));
     memset(head,-,sizeof(head));
     tot=-;
     ; i<=m; i++){
         scanf("%d%d", &u, &v);
         out[u]++;
         ind[v]++;
         insert(u,v);
     }
     ;
     memset(vis,,sizeof(vis));
     memset(dp,,sizeof(dp));
     ; i<=n; i++)
          && )
             ans+=dfs(i);
     printf("%d\n", ans);
     ;
 }