zoukankan      html  css  js  c++  java
  • 【bzoj4562】[Haoi2016]食物链

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

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

    *输出:
    一个整数即食物网中的食物链条数

    *样例输入:
    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

    *样例输出:
    9

    *题解:
    拓扑排序+瞎jb乱DP。
    生物课上想到的算食物链数量的方法。然后发现居然真的有这种题。。。然后写了两发就过了。(细节:只有一个点的不算生物链)

    *代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    
    #ifdef WIN32
        #define LL "%I64d"
    #else
        #define LL "%lld"
    #endif
    
    #ifdef CT
        #define debug(...) printf(__VA_ARGS__)
        #define setfile() 
    #else
        #define debug(...)
        #define filename ""
        #define setfile() freopen(filename".in", "r", stdin); freopen(filename".out", "w", stdout)
    #endif
    
    #define R register
    #define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
    #define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
    #define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
    #define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
    #define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
    #define cabs(_x) ((_x) < 0 ? (- (_x)) : (_x))
    char B[1 << 15], *S = B, *T = B;
    inline int F()
    {
        R char ch; R int cnt = 0; R bool minus = 0;
        while (ch = getc(), (ch < '0' || ch > '9') && ch != '-') ;
        ch == '-' ? minus = 1 : cnt = ch - '0';
        while (ch = getc(), ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0';
        return minus ? -cnt : cnt;
    }
    #define maxn 100010
    #define maxm 300010
    struct Edge
    {
        Edge *next;
        int to;
    }*last[maxn], e[maxm], *ecnt = e;
    inline void link(R int a, R int b)
    {
        *++ecnt = (Edge) {last[a], b}; last[a] = ecnt;
    }
    int in[maxn], out[maxn], f[maxn];
    std::queue<int> q;
    int main()
    {
    //  setfile();
        R int n = F(), m = F();
        for (R int i = 1; i <= m; ++i)
        {
            R int a = F(), b = F();
            link(a, b); ++in[b]; ++out[a];
        }
        R int s = 0, t = n + 1;
        for (R int i = 1; i <= n; ++i)
        {
            if (!in[i]) link(s, i), ++in[i];
            else if (!out[i]) link(i, t);
        }
        q.push(s); f[s] = 1;
        while (!q.empty())
        {
            R int now = q.front(); q.pop();
            for (R Edge *iter = last[now]; iter; iter = iter -> next)
            {
                f[iter -> to] += f[now];
                if (--in[iter -> to] == 0) q.push(iter -> to);
            }
        }
        printf("%d
    ", f[t] );
        return 0;
    }
  • 相关阅读:
    卫星星下点轨迹Matlab仿真
    ARM反汇编学习
    NS 2.35 柯志亨书实验3笔记TCP UDP模拟 ——计算FTP不同参数:时延、抖动、吞吐率、丢包率awk代码
    NS 2.35 柯志亨书实验4笔记随机数产生
    摄像头驱动学习
    一次输出8bit_n4_m序列Simulink仿真Verilog实现
    NS 2.35 柯志亨书实验3笔记TCP UDP模拟
    FFT2 图像二维FFT含义解释
    有限元FEM求解一维电磁场问题 Rits法 Galerkin法
    python3+pygame实现的2048,非常完整的代码
  • 原文地址:https://www.cnblogs.com/cocottt/p/6764980.html
Copyright © 2011-2022 走看看