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


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

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

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

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

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

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 #define maxn 100010
     5 using namespace std;
     6 struct node{
     7     int from,to,next;
     8 }e[maxn*2];
     9 int head[maxn],vis[maxn],dp[maxn],ind[maxn],out[maxn];
    10 int tot,n,m,u,v;
    11 
    12 void insert(int u, int v){
    13     e[++tot].from=u;
    14     e[tot].to=v;
    15     e[tot].next=head[u];
    16     head[u]=tot;
    17 }
    18 
    19 int dfs(int x){
    20     if (vis[x]) return dp[x];
    21     vis[x]=1;
    22     if (out[x]==0){
    23         dp[x]=1;
    24         return 1;
    25     }
    26     int sum=0;
    27     for (int i=head[x]; i!=-1; i=e[i].next){
    28         int v=e[i].to;
    29         sum+=dfs(v);
    30     }
    31     dp[x]=sum;
    32     return sum;
    33 }
    34 
    35 int main(){
    36     scanf("%d%d", &n, &m);
    37     memset(ind,0,sizeof(ind));
    38     memset(out,0,sizeof(out));
    39     memset(head,-1,sizeof(head));
    40     tot=-1;
    41     for (int i=1; i<=m; i++){
    42         scanf("%d%d", &u, &v);
    43         out[u]++;
    44         ind[v]++;
    45         insert(u,v);
    46     }
    47     int ans=0;
    48     memset(vis,0,sizeof(vis));
    49     memset(dp,0,sizeof(dp));
    50     for (int i=1; i<=n; i++)
    51         if (ind[i]==0 && out[i]!=0)
    52             ans+=dfs(i);
    53     printf("%d
    ", ans);
    54     return 0;
    55 }
  • 相关阅读:
    部署openstack的官网文档解读mysql的配置文件
    ubuntu14.04行更新软件包
    Ubuntu14.04上修改主机名
    ubuntu上修改root密码
    在ISE查看各个模块消耗的资源
    132
    Aurora 8B/10B、PCIe 2.0、SRIO 2.0三种协议比较
    NAND flash和NOR flash的区别详解
    FPGA三分频,五分频,奇数分频
    以太网之物理层
  • 原文地址:https://www.cnblogs.com/mzl0707/p/5440218.html
Copyright © 2020-2023  润新知