解题记录 P4017 最大食物链计数 拓扑排序
题意:
给你一个食物链 DAG, 求最多有多少条食物链, 对结果取余 8011200280112002
思路:
想要找到一条 最大食物链 ,那么这条路径的 起点 入度要为0,终点 出度要为0。
故:既要记录入度,还要记录出度!
现在的问题转换成了,如何找到图中所有 左端点入度为0 且 右端点出度为0 的路径的数量
初始化所有入度为 0 的点的答案为1
拓扑排序 需要删除的点的答案 都累加到 它可以到达的点 上面去
最后累加所有 出度为0的点(最末尾消费者) 的答案,输出即可。
为什么要用拓扑排序 而不用搜索
如果是直接的搜索 会发现很多点的访问都会重复, 所以时间复杂度很高, 但是可以剪枝的(当走到一个多个入度节点的时候停下来, 等最后一个节点过来, 再继续搜下去), 这里不展开叙述
而拓扑排序可以大大减少一个节点的访问次数, 因此时间复杂度较优
#include <bits/stdc++.h>
using namespace std;const int MAXN = 5005;
const int mod = 80112002;
int n, m;
struct edge {int to, cost = 1;edge(int to) {this->to = to;}
};
vector<edge> e[MAXN];
int ru[MAXN], chu[MAXN];
int num[MAXN];
void slove() {queue<int> que;vector<int> ans;for(int i = 1; i <= n; i++) {if(!ru[i]) {num[i] = 1;que.push(i);}}while(!que.empty()) {int u = que.front();que.pop();ans.push_back(u);for(int i = 0; i < e[u].size(); i++) {edge x = e[u][i];--ru[x.to];if(!ru[x.to]) que.push(x.to);num[x.to] = (num[x.to] + num[u]) % mod;}}int u = 0;for(int i = 1; i <= n; i++) {if(!chu[i]) u = (u + num[i]) % mod;}cout << u << endl;
}int main() {cin >> n >> m;for(int i = 1; i <= m; i++) {int a, b;cin >> a >> b;e[a].push_back(edge(b));ru[b]++;chu[a]++;}slove();return 0;
}
解题记录 P4017 最大食物链计数 拓扑排序相关推荐
- 图解Topo拓扑排序 例题洛谷P4017 最大食物链计数
适用条件:无环图 输出结果:使得每个节点,以它为终点的起点节点排都在其前面 作用:递推保证前面的节点都已经被使用过 实现方法:从没有入边的节点开始,输出并从其他节点中删去自己,重复此步骤直到所有节点都 ...
- 洛谷 P4017 最大食物链计数
题目背景 你知道食物链吗?Delia 生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧. 题目描述 给你一个食物 ...
- P4017 最大食物链计数
题目背景 你知道食物链吗?Delia 生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧. 题目描述 给你一个食物 ...
- 拓扑排序-信息学奥赛
拓扑排序 制作人:(CwinSpider) 文章目录 拓扑排序 一.前置知识 二.知识讲解 1. 什么是拓扑排序? 2. 拓扑排序的实现 3. 拓扑排序的应用 4. 拓扑排序的复杂度分析 三.课堂练习 ...
- LeetCode 1786. 从第一个节点出发到最后一个节点的受限路径数(迪杰斯特拉 + 拓扑排序)
文章目录 1. 题目 2. 解题 1. 题目 现有一个加权无向连通图. 给你一个正整数 n ,表示图中有 n 个节点,并按从 1 到 n 给节点编号:另给你一个数组 edges ,其中每个 edges ...
- 洛谷 最大食物链计数 python题解
题目:P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 给你一个食物网,你要求出这个食物网中最大食物链的数量. (这里的"最大食物链&q ...
- P3573-[POI2014]RAJ-Rally【拓扑排序,二分+树状数组】
正题 题目链接:https://www.luogu.com.cn/problem/P3573 题目大意 nnn个点mmm条边的DAGDAGDAG,删掉一个点使得最长路最短. 解题思路 先跑一遍拓扑排序 ...
- P1983 车站分级(拓扑排序)
车站分级 题目传送门 解题思路 这题就是用拓扑排序分层 首先是建图 每进行一次输入,就将没有停靠的站与停靠的站都建立一条边 因为题目样例不怎么大,所以可以用邻接矩阵 for(int i=1;i< ...
- 拓扑排序——最大食物链计数(洛谷 P4017)
题目选自洛谷P4017 这里具体讲一下为什么要用拓扑排序(思维过程): 1.这是一道图论题: 2.不是求最短路: 3.根据提示"最左端是不会捕食其他生物的生产者"可以想到,我们要入 ...
最新文章
- Tips系列之飞书日历
- spark 执行流程及各组件执行
- javaone_JavaOne 2012:观察与印象
- leetcode67. 二进制求和
- MyBatis 二级缓存
- Bailian2753 菲波那契数列(POJ NOI0202-1755)【数列+记忆化递归】
- java debug怎么用_debug怎么用
- 立项、合同、项目章程、可行性分析、建设方案、项目范围、关系等比较重要的部分
- matlab读取jpg图片出错,求助,Matlab读取图片进行分类。出现错误
- pngimg 可以商用吗_超级干货,30个无版权免费商用高清素材网站整理(设计师必备灵感源泉)...
- 有毒气体传感器代替金丝雀和老鼠在矿山
- python字母表_Python 一句话生成字母表的方法
- 2001-2019年290个地级市人均GDP
- windows 下使用nginx 实现负载均衡
- 基于springboot2.0跟layui构建的前后端分离后台管理系统
- 云服务器上部署仿牛客网项目
- AMOS从模型到分析
- Cohn-Kanade数据库
- Cadence电路原理图全部变成黄色如何解决?
- 树莓派开发系列教程2——树莓派上手使用