P4017 最大食物链计数

题目:P4017 最大食物链计数

知识点:链式前向星建图、同余原理、拓扑排序、动态规划

CODE:

cpp 复制代码
#include <bits/stdc++.h>
#define MOD 80112002
using namespace std;

static const int N = 5005;
static const int M = 500005;

vector<int> head(N, 0);
vector<int> nxt(M, 0);
vector<int> to(M, 0);

vector<int> idgr(N, 0);
vector<int> odgr(N, 0);

vector<int> dp(N, 0);


int main() {
    int n, m;
    cin >> n >> m;
    int cnt = 1;
    while (m--) {
        int f, t;
        cin >> f >> t;
        // idgr & odgr
        odgr[f]++;
        idgr[t]++;
        // f -> t
        to[cnt] = t;
        nxt[cnt] = head[f];
        head[f] = cnt++;
    }

    // ...
    queue<int> q;
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        if (idgr[i] == 0) {
            q.emplace(i);
            dp[i] = 1;
            if (odgr[i] == 0) {
                ans++;
            }
        }
    }

    while (!q.empty()) {
        int f = q.front();
        q.pop();
        int e = head[f];
        while (e != 0) {
            // 边 e
            int v = to[e];
            idgr[v]--;
            // dp[v] += dp[f];
            dp[v] = ((dp[v] % MOD) + dp[f]) % MOD;
            if (idgr[v] == 0) {
                q.emplace(v);
                if (odgr[v] == 0) {
                    ans = ((ans % MOD) + dp[v]) % MOD;
                }
            }
            e = nxt[e];
        }
    }

    cout << ans << endl;

}

易错点:

①对于孤立点,要计算一次,42line
②对于拓扑排序的终点,是当入度变为 0 时才去判断是否为终点,而不是只要出度为 0 就记录,如下为错误示例,这会导致入度为复数的终点重复计算
cpp 复制代码
// ...
if (idgr[v] == 0) {
  q.emplace(v);
}
if (odgr[v] == 0 {
  ans = ((ans % MOD) + dp[v]) % MOD;
}
相关推荐
西柚研究生1234561 小时前
论文分析15:跨层特征交互的多尺度无人机小目标检测算法
人工智能·算法·目标检测
rannn_1118 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
数模竞赛Paid answer8 小时前
2026年华东杯数学建模B题医药物流安排问题解题全过程文档及程序
算法·数学建模·数据分析·华东杯
不会代码的小猴9 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
青瓦梦滋9 小时前
传输层UDP/TCP协议
linux·网络·c++·网络协议·tcp/ip·udp
AI备案指南-满满10 小时前
大模型与算法备案全流程详解:从零到通过的完整指南
人工智能·算法·备案·大模型备案·算法备案
江畔柳前堤10 小时前
LLM 训练核心机制深度解析:Warmup、Cosine Decay 与 Perplexity 的完整知识体系
网络·人工智能·深度学习·算法·机器学习·语音识别
一只旭宝10 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
良木林10 小时前
子串 - LeetCode hot 100
算法·leetcode·职场和发展