洛谷 P4017 最大食物链计数 题解
P4017 最大食物链计数
题目背景
你知道食物链吗?Delia生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条。于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧。
题目描述
给你一个食物网,你要求出这个食物网中最大食物链的数量。
(这里的“最大食物链”,指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费者。)
Delia非常急,所以你只有1秒的时间。
由于这个结果可能过大,你只需要输出总数模上80112002的结果。
输入格式
第一行,两个正整数n、m,表示生物种类n和吃与被吃的关系数m。
接下来m行,每行两个正整数,表示被吃的生物A和吃A的生物B。
输出格式
一行一个整数,为最大食物链数量模上80112002的结果。
输入输出样例
输入 #1
5 7
1 2
1 3
2 3
3 5
2 5
4 5
3 4
输出 #1
5
说明/提示
各测试点满足以下约定:

【补充说明】
数据中不会出现环,满足生物学的要求。(感谢@AKEE )
【思路】
记忆化搜索
一开始我想DP然后失败了
不过貌似记忆化搜索很好想
所以我就来尝试了一哈
没有问题
【吐槽】
(和食物链的代码几乎一样)
(黄题食物链不是另一道)
模数为80112002
我觉得是出题人的生日是20021108吼
有意思
【题目大意】
有向图,找完整的链的数目
(完整的链的意思是:
链的头不能有入边,链的尾不能有出边)
【题目分析】
上面已经说过
一条完整的链就是链的头不能有入边
链的尾不能有出边
因为如果还有的话那就是还有可以被吃或者吃的
那这条食物链就没有结束
就不能算是一条食物链
(学过生物食物链那一部分知识的的应该都知道)
所以搜索的时候就有了目标
从头开始搜,因为头要满足没有入边
所以在建图的时候记录入度和出度
然后如果这个点没有入度
那就是可以搜的
但是还是有一个条件的
他必须要有出度才能搜
不然就成了一个没有入度也没有出度的点
也就是一种孤立的生物
所以必须满足没有入度并且有出度
这样同时也可以避免把孤立的生物算进来
这样搜索肯定是要超时的
所以就要考虑优化
【优化】
剪枝?不现实
没一条边都有可能参与到食物链的构建中去
所以剪枝的话没有剪枝的条件
那就记忆化搜索吧
反正每个点之后会有多少条食物链都是一定的
那就开一个数组记录每个点之后有多少条食物链
这样如果数组里面有值
那就直接加上就好了
否则就搜一下然后记录起来
【完整代码】
#include<iostream>
#include<cstdio>
#define int long long
#define mo 80112002
using namespace std;
const int Max = 200010;
struct node
{
int y,ne;
}a[Max << 2];
int head[Max >> 1],sum = 0;
void add(int x,int y)
{
a[++ sum].y = y;
a[sum].ne = head[x];
head[x] = sum;
}
int ru[Max >> 2],chu[Max >> 2];
int dp[Max >> 2];
int ans = 0;
int dfs(int x)
{
if(dp[x] != 0)return dp[x];
int ans = 0;
if(ru[x] != 0 && chu[x] == 0)
ans ++;
for(register int i = head[x];i != 0;i = a[i].ne)
{
ans += dfs(a[i].y);
}
dp[x] = ans % mo;
return ans % mo;
}
signed main()
{
freopen("food.in","r",stdin);
int n,m;
cin >> n >> m;
int a,b;
for(register int i = 1;i <= m;++ i)
{
cin >> a >> b;
add(a,b);
chu[a] ++;
ru[b] ++;
}
int tot = 0;
for(register int i = 1;i <= n;++ i)
if(ru[i] == 0 && chu[i] != 0)
tot += dfs(i) % mo;
cout << tot % mo << endl;
return 0;
}
洛谷 P4017 最大食物链计数 题解的更多相关文章
- 洛谷 P4017 最大食物链计数
洛谷 P4017 最大食物链计数 洛谷传送门 题目背景 你知道食物链吗?Delia生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写 ...
- 动态规划 洛谷P4017 最大食物链计数——图上动态规划 拓扑排序
洛谷P4017 最大食物链计数 这是洛谷一题普及/提高-的题目,也是我第一次做的一题 图上动态规划/拓扑排序 ,我认为这题是很好的学习拓扑排序的题目. 在这题中,我学到了几个名词,入度,出度,及没有环 ...
- 洛谷——P4017 最大食物链计数
P4017 最大食物链计数 题目背景 你知道食物链吗?Delia生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧 ...
- 洛谷 P4017 最大食物链计数 (拓扑排序,思维)
题意:有\(n\)个点,连\(m\)条边,求最多有多少条食物链(从头走到为有多少条路径). 题解:之前抽了点时间把拓扑排序补完了,这题其实就是一道拓扑排序的裸题.关于拓扑排序: 1.首先,我们用\ ...
- 洛谷P4017 最大食物链计数
拓扑排序板子题 #include <iostream> #include <cstdio> #include <cstring> #include <queu ...
- 洛谷P1144最短路计数题解
最短路计数 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用\(SPFA\)预处理出所有点的最短路,然后我们反向记忆化搜索,可以用\(sum ...
- 洛谷 P1144 最短路计数 题解
P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点\(1\)开始,到其他每个点的最短路有几条. 输入格式 第一行包含\(2\)个正 ...
- 洛谷 P4071 [SDOI2016]排列计数 题解
P4071 [SDOI2016]排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳 ...
- 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...
随机推荐
- 1、C#多线程基础理论
系统为应用程序分配所需的内存以及其他资源,内存和资源的物理分离叫做进程. 进程是以线程为单位竞争CPU,那么什么是线程呢? 线程可看成一个可执行的指令单元,他使用进程中的数据,包含若干条指令,进程 ...
- JS前端加密JAVA后端解密详解
最近有一个加解密的需求,其实没有什么难度,但是实践过程中踩了很多坑,把踩坑过程分享出来. 1.前端JS加密 /** * 加密(需要先加载aes.min.js文件) * @param word * @r ...
- 在Linux系统中创建SSH服务器别名
如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间.你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名.主机名.SSH 端口号和 IP 地 ...
- pandas-15 df['one_col'].apply()方法的用法
pandas-15 df['one_col'].apply()方法的用法 apply有点像map的用法,可以传入一个函数. 如:df['A'].apply(str.upper) import nump ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记4——Ethereum Wallet中部署合约
账号创建完成之后,账号余额是0,但是部署合约是需要消耗GAS的,因此需要获取一定的以太币才能够继续本次实现.在测试网中获取以太币可以通过挖矿的方式,在开发菜单中可以选择打开挖矿模式,但是这需要将Syn ...
- Java框架之MyBatis框架(二)
Mybatis框架是相对于优化dao层的框架,其有效的减少了频繁的连接数据库(在配置文件xml中进行配置),将sql语句与java代码进行分离(写在XXXXmapper.xml文件中,一个表对应一个x ...
- CSS-盒模型与文本溢出笔记
注意点: 文本居中: text-align:center:文本左右居中 line-heigh:30px; 等于容器高度时,单行文本上下居中 margin:0 auto: 浏览器居中 清除margin ...
- 令人兴奋的TOP Server OPC Server v6.5 五大功能(上)
Software Toolbox的OPC和原生HMI设备的连接软件:TOP Server OPC Server.TOP Server OPC Server是采用业界领先的Kepware技术的工业4.0 ...
- java-检查IP和端口在超时时间内是否可以连接
检查IP和端口在超时时间内是否可以连接 /** * 检查IP和端口是否可以连接 * @param ip * @param port * @return */ private static boolea ...
- PB连接数据库
SQLCA.DBMS = "ODBC" SQLCA..AutoCommit = False SQLCA.DBParm = "ConnectString='DSN=fire ...