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 最大食物链计数 题解的更多相关文章

  1. 洛谷 P4017 最大食物链计数

    洛谷 P4017 最大食物链计数 洛谷传送门 题目背景 你知道食物链吗?Delia生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写 ...

  2. 动态规划 洛谷P4017 最大食物链计数——图上动态规划 拓扑排序

    洛谷P4017 最大食物链计数 这是洛谷一题普及/提高-的题目,也是我第一次做的一题 图上动态规划/拓扑排序 ,我认为这题是很好的学习拓扑排序的题目. 在这题中,我学到了几个名词,入度,出度,及没有环 ...

  3. 洛谷——P4017 最大食物链计数

    P4017 最大食物链计数 题目背景 你知道食物链吗?Delia生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧 ...

  4. 洛谷 P4017 最大食物链计数 (拓扑排序,思维)

    题意:有\(n\)个点,连\(m\)条边,求最多有多少条食物链(从头走到为有多少条路径). 题解:之前抽了点时间把拓扑排序补完了,这题其实就是一道拓扑排序的裸题.关于拓扑排序: ​ 1.首先,我们用\ ...

  5. 洛谷P4017 最大食物链计数

    拓扑排序板子题 #include <iostream> #include <cstdio> #include <cstring> #include <queu ...

  6. 洛谷P1144最短路计数题解

    最短路计数 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用\(SPFA\)预处理出所有点的最短路,然后我们反向记忆化搜索,可以用\(sum ...

  7. 洛谷 P1144 最短路计数 题解

    P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点\(1\)开始,到其他每个点的最短路有几条. 输入格式 第一行包含\(2\)个正 ...

  8. 洛谷 P4071 [SDOI2016]排列计数 题解

    P4071 [SDOI2016]排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳 ...

  9. 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP

    题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...

随机推荐

  1. 转:使用Goproxy解决golang.org模块无法下载的问题

    原文https://studygolang.com/articles/22277?fr=sidebar 简介 Goproxy 中国完全实现了 Go 的模块代理协议.并且它是一个由中国备受信赖的云服务提 ...

  2. WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里?

    原文:WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里? 在 WPF 程序中,我们有 Mouse.GetPosition(IInputElement relativeTo) 方法可以拿到鼠标 ...

  3. C#采集摄像头实时画面和抓拍

    在.net中,并没有简单直接的操纵摄像头的类.那么如何简单快捷地采集摄像头的画面,进行抓拍等操作呢?答案是调用SharpCapture!专业采集摄像头画面等数据的类库.下面开始演示关键代码,您也可以在 ...

  4. Hibernate的关联映射--一对多、

    这是我 1 单向一对多: 实体类:(课程类)Grade与(学生类)Student的一对多关系 学生类: public class Student implements java.io.Serializ ...

  5. js数据类型及变量知识(一)

    1.js中基本数据类型有哪些?    基本数据类型:        undefined.number.string.boolean.null.[object] object[引用数据类型]       ...

  6. 如何解决div背景色半透明,里面的图片不透明问题

    用rgba可以实现,不能用opacity 背景做成透明的背景图,opacity属性影响子集的,除非把两者独立开~

  7. JavaWeb 之 三层架构:软件设计架构

    界面层(表示层):用户看的得界面.用户可以通过界面上的组件和服务器进行交互. 业务逻辑层:处理业务逻辑的. 数据访问层:操作数据存储文件.

  8. RSA算法一:数学原理

  9. C# EF框架 频繁连接性能损耗

    目的 测试EF框架在一次连接中多次保存和多次连接的耗时对比 测试环境 数据库SqlServer 2012 R2 EF框架6.2.0版本 数据库内容 ID UserName Password Creat ...

  10. 使用EwoMail搭建属于自己的个人邮件服务器——超详细图文教程

    版权声明:本文为CSDN博主「C_成」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_41692307 ...