zoukankan      html  css  js  c++  java
  • BZOJ4562: [Haoi2016]食物链

    Description

    如图所示为某生态系统的食物网示意图,据图回答第1小题
    现在给你n个物种和m条能量流动关系,求其中的食物链条数。
    物种的名称为从1到n编号
    M条能量流动关系形如
    a1 b1
    a2 b2
    a3 b3
    ......
    am-1 bm-1
    am bm
    其中ai bi表示能量从物种ai流向物种bi,注意单独的一种孤立生物不算一条食物链
     

    Input

    第一行两个整数n和m,接下来m行每行两个整数ai bi描述m条能量流动关系。
    (数据保证输入数据符号生物学特点,且不会有重复的能量流动关系出现)
    1<=N<=100000 0<=m<=200000
    题目保证答案不会爆 int

    Output

    一个整数即食物网中的食物链条数

    Sample Input

    10 16
    1 2
    1 4
    1 10
    2 3
    2 5
    4 3
    4 5
    4 8
    6 5
    7 6
    7 9
    8 5
    9 8
    10 6
    10 7
    10 9

    Sample Output

    9
     
    出生物题是什么心态???
    一条食物链就是从0入度节点到0出度节点的一条路径,而这又是一个DAG,所以拓扑排序后随便DP一下就好了。
    #include<cstdio>
    #include<cctype>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    #define rep(i,s,t) for(int i=s;i<=t;i++)
    #define dwn(i,s,t) for(int i=s;i>=t;i--)
    #define ren for(int i=first[x];i;i=next[i])
    using namespace std;
    const int BufferSize=1<<16;
    char buffer[BufferSize],*head,*tail;
    inline char Getchar() {
        if(head==tail) {
            int l=fread(buffer,1,BufferSize,stdin);
            tail=(head=buffer)+l;
        }
        return *head++;
    }
    inline int read() {
        int x=0,f=1;char c=Getchar();
        for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
        for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
        return x*f;
    }
    const int maxn=100010;
    const int maxm=200010;
    typedef long long ll;
    int n,m,first[maxn],deg[maxn],in[maxn],is[maxn],next[maxm],to[maxm],e;
    void AddEdge(int u,int v) {
        in[v]++;deg[v]++;is[u]=1;to[++e]=v;next[e]=first[u];first[u]=e;
    }
    int Q[maxn],f[maxn],g[maxn];
    int main() {
        n=read();m=read();
        rep(i,1,m) AddEdge(read(),read());
        int l=1,r=0;
        rep(i,1,n) if(!in[i]) Q[++r]=i,f[i]=1;
        while(l<=r) {
            int x=Q[l++];
            ren {
                f[to[i]]+=f[x];
                if(!(--in[to[i]])) Q[++r]=to[i];
            }
        }
        int ans=0;
        rep(i,1,n) if(!is[i]&&deg[i]) ans+=f[i];
        printf("%d
    ",ans);
        return 0;
    }
    

      

  • 相关阅读:
    面向对象之多态,property
    描述符
    day23 面向对象之继承
    day22面向对象
    os模块
    logging日志模块,四种方式
    Linux 如何测试 IO 性能(磁盘读写速度)
    Vi命令:如何删除全部内容
    cdnbest如何查看站点操作日志(同步日志)
    Linux查找含有某字符串的所有文件
  • 原文地址:https://www.cnblogs.com/wzj-is-a-juruo/p/5552671.html
Copyright © 2011-2022 走看看