P3183 [HAOI2016]食物链

题目描述

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

输入格式

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

输出格式

一个整数即食物网中的食物链条数

输入输出样例

输入 #1

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

输出 #1

9

【思路】

记忆化搜索

一开始我想DP然后失败了

不过貌似记忆化搜索很好想

所以我就来尝试了一哈

没有问题

【题目大意】

有向图,找完整的链的数目

(完整的链的意思是:

链的头不能有入边,链的尾不能有出边)

【题目分析】

上面已经说过

一条完整的链就是链的头不能有入边

链的尾不能有出边

因为如果还有的话那就是还有可以被吃或者吃的

那这条食物链就没有结束

就不能算是一条食物链

(学过生物食物链那一部分知识的的应该都知道)

所以搜索的时候就有了目标

从头开始搜,因为头要满足没有入边

所以在建图的时候记录入度和出度

然后如果这个点没有入度

那就是可以搜的

但是还是有一个条件的

他必须要有出度才能搜

不然就成了一个没有入度也没有出度的点

也就是一种孤立的生物

所以必须满足没有入度并且有出度

这样同时也可以避免把孤立的生物算进来

这样搜索肯定是要超时的

所以就要考虑优化

【优化】

剪枝?不现实

没一条边都有可能参与到食物链的构建中去

所以剪枝的话没有剪枝的条件

那就记忆化搜索吧

反正每个点之后会有多少条食物链都是一定的

那就开一个数组记录每个点之后有多少条食物链

这样如果数组里面有值

那就直接加上就好了

否则就搜一下然后记录起来

【完整代码】

#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
const int Max = 200005;
struct node
{
int y,ne;
}a[Max];
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 >> 1],chu[Max >> 1];
int dp[Max >> 1];
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;
return ans;
} signed main()
{
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);
cout << tot << endl;
return 0;
}

洛谷 P3183 [HAOI2016]食物链 题解的更多相关文章

  1. 洛谷——P3183 [HAOI2016]食物链

    P3183 [HAOI2016]食物链 题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数.物种的名称为从1到n编号M条能量流动关系形 ...

  2. 洛谷 P3183 [HAOI2016]食物链

    题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数.物种的名称为从1到n编号M条能量流动关系形如a1 b1a2 b2a3 b3.... ...

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

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

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

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

  5. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  6. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  7. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  8. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  9. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

随机推荐

  1. git 学习笔记 ---解决冲突

    人生不如意之事十之八九,合并分支往往也不是一帆风顺的. 准备新的feature1分支,继续我们的新分支开发: $ git checkout -b feature1 Switched to a new ...

  2. Drools7 Hello Wrold 入门详细步骤--系列01课

    一.什么叫规则引擎?规则--->写在文档上引擎--->在java代码上,引用这个文档上的规则 二.drools规则引擎有什么用?简单来说就是将多变的规则,从业务代码中剥离出来(当规则变了之 ...

  3. @SuppressWarnings注解用法

    @SuppressWarnings注解主要用在取消一些编译器产生的警告对代码左侧行列的遮挡,有时候这会挡住我们断点调试时打的断点. 如图所示: 这时候我们在方法上加上@SuppressWarnings ...

  4. ADO.net(内置类区别)随记

    Ado.net使用流程 SqlConnection->open->SqlCommand(sqlstring,conn)->(ExcuteNonQuery \ExecuteScalar ...

  5. nodeJS从入门到进阶二(网络部分)

    一.网络服务器 1.http状态码 1xx: 表示普通请求,没有特殊含义 2xx:请求成功 200:请求成功 3xx:表示重定向 301 永久重定向 302 临时重定向 303 使用缓存(服务器没有更 ...

  6. Java项目之查询后分页

    一.Jsp页面: <%@ page language="java" contentType="text/html; charset=UTF-8" page ...

  7. vue中keep-alive,include的指定页面缓存问题

    做vue项目时,有时要在某些页面做缓存,而其它页面不要.比如:A:首页,B:获取所有订单页面,C:订单详情页面:从A(首页)进入 B(获取所有订单)时应该不缓存,B(所有订单)进入 C(订单详情)订单 ...

  8. Navicat导出数据库设计文档

    前言:仅支持单表导出 导出sql: SELECT TABLE_NAME 表名, COLUMN_NAME 列名, COLUMN_TYPE 数据类型, COLUMN_KEY 主键, IF(IS_NULLA ...

  9. 软工作业 wc-java

    项目要求: 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处理多个文件. 具体功能 -c 返回文件字符数 -w 返回词的数目 -l 返回行数 扩展 ...

  10. zookeeper 事务日志查看

    在version下的日志是二进制文件,查看需要转换 创建/data/middleware/zookeeper-3.4.14/translog.sh 脚本 格式化命令: java -classpath ...