【洛谷 P4017】最大食物链计数 题解(深度优先搜索+动态规划+邻接表+记忆化搜索+剪枝)

news2024/11/25 16:21:10

最大食物链计数

题目背景

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

题目描述

给你一个食物网,你要求出这个食物网中最大食物链的数量。

(这里的“最大食物链”,指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费者。)

Delia 非常急,所以你只有 1 1 1 秒的时间。

由于这个结果可能过大,你只需要输出总数模上 80112002 80112002 80112002 的结果。

输入格式

第一行,两个正整数 n 、 m n、m nm,表示生物种类 n n n 和吃与被吃的关系数 m m m

接下来 m m m 行,每行两个正整数,表示被吃的生物A和吃A的生物B。

输出格式

一行一个整数,为最大食物链数量模上 80112002 80112002 80112002 的结果。

样例 #1

样例输入 #1

5 7
1 2
1 3
2 3
3 5
2 5
4 5
3 4

样例输出 #1

5

提示

各测试点满足以下约定:

【补充说明】

数据中不会出现环,满足生物学的要求。(感谢 @AKEE )


思路

食物网可以看作是一个有向图,每个生物种类是一个节点,每个食物关系是一个有向边。所求的最大食物链的数量,就是计算有向图中从源点(没有入度的点)到达终点(没有出度的点)的所有路径的数量。

首先,定义一些全局变量。其中,N 是节点的最大数量,MOD 是取模的基数,nm 分别表示节点的数量和边的数量,ans 用来存储最终的结果,dp 是一个数组,用来存储每个节点的最大食物链的数量,inDoutD 是两个数组,分别用来存储每个节点的入度和出度,g 是一个邻接表,用来存储图的信息,vis 是一个位集,用来标记每个节点是否被访问过。

main 函数中,首先通过 memset 函数将 inDoutDdp 数组的所有元素初始化为 0,然后读取节点的数量 n 和边的数量 m,并根据输入的边的信息,更新 inDoutDg。之后,对于每一个没有入度的节点,调用 dfs 函数进行深度优先搜索,并更新 ans

dfs 函数中,首先检查当前节点是否被访问过,如果已经被访问过,就直接返回。然后,将当前节点标记为已访问。接着,如果当前节点没有出度,就将 dp 数组中对应的元素设置为 1,然后返回。否则,对于当前节点的每一个邻接节点,调用 dfs 函数,并更新 dp 数组中对应的元素。

最后,输出 ansMOD 取模的结果。

注意

由于结果可能过大,每次计算路径数求和时都需要输出总数模上 80112002 80112002 80112002 的结果,否则无法通过部分测试点。


AC代码

#include <algorithm>
#include <bitset>
#include <cstring>
#include <iostream>
#include <vector>
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;

const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const int MOD = 80112002;

ll n, m;
ll ans = 0;
ll dp[N];
ll inD[N], outD[N];
vector<ll> g[N];
bitset<N> vis;

void dfs(ll x) {
	if (vis[x]) {
		return;
	}
	vis[x] = 1;
	// cout << x << endl;
	if (!outD[x]) {
		// 最右端是不会被其他生物捕食的消费者
		dp[x] = 1;
		return;
	}
	ll sum = 0;
	for (const auto i : g[x]) {
		dfs(i);
		sum += dp[i];
		sum %= MOD;
	}
	dp[x] = max(dp[x], sum);
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	memset(inD, 0, sizeof(inD));
	memset(outD, 0, sizeof(outD));
	memset(dp, 0, sizeof(dp));

	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		ll a, b;
		cin >> a >> b;
		outD[a]++;
		inD[b]++;
		g[a].push_back(b);
	}

	vis.reset();
	for (int i = 1; i <= n; i++) {
		if (!inD[i]) {
			// 最左端是不会捕食其他生物的生产者
			dfs(i);
			ans += dp[i];
			ans %= MOD;
			// cout << i << " " << dp[i] << endl;
		}
	}
	//	for(int i = 1; i <= n; i++) {
	//		cout << i << " " << dp[i] << endl;
	//	}
	cout << (ans % MOD) << "\n";
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1587994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java核心技术】第4章 对象与类

1 面向对象 2 自定义类 形式&#xff1a; class ClassName { field // 字段 constructor // 构造器&#xff08;构造函数&#xff09; method // 方法 } 如&#xff1a; class Employee {private String name;private double salary;private LocalDate hireDay;public Emp…

【拓展技术】——AutoDL服务器训练Pycharm使用注意点Pycharm配置AutoDL

一、AutoDL服务器模型训练 AutoDL是一个为研究人员、开发者和企业提供的平台&#xff0c;它致力于提供一个高效、可靠和易用的环境&#xff0c;以支持复杂的计算任务和AI模型的部署&#xff1a; 高效的并行计算资源&#xff1a;AutoDL拥有强大的计算集群和高性能的计算节点&a…

MySOL之旅--------MySQL数据库基础( 2 )

本篇碎碎念:尽自己最大的努力,直到筋疲力尽为止,加油 今日份励志文案: 别人都在前进,我为什么要停下 目录 补上一条博客缺失的内容 常用数据类型 数值类型&#xff1a; 字符串类型&#xff1a; 日期/时间类型&#xff1a; 二进制类型&#xff1a; 其他类型&#xff1a; …

工业4G路由器SR500护航清远市智慧环卫项目

一、项目背景 随着智慧城市建设的不断推进,清远市政府高度重视城市环卫管理的智能化升级。由于清远地处山区,环卫作业路线长、工作环境复杂,有效监控和调度成为亟待解决的难题。 经过严格筛选,清远市最终选定了星创易联科技的SR500双网口4G工业路由器,与环卫车载智能终端配合使…

BM25和语言模型的改进研究

原文链接&#xff1a; BM25和语言模型的改进研究 摘要&#xff1a; 近期关于搜索引擎排名函数的研究报告指出&#xff0c;BM25和带Dirichlet平滑的语言模型有所改进。本研究通过在INEX 2009维基百科语料库上训练&#xff0c;然后在INEX 2010和9个TREC语料库上测试&#xff0…

ffmpeg命令与批处理编程

(一) CMD脚本查找所有文件 powershell与cmd转换 powershell与cmd虽然同为windows命令&#xff0c;但许多命令并不通用。 CMD换行符 a 在CMD下&#xff0c;可以用^作为换行符&#xff0c;类似于Linux下的\。举例如下&#xff1a; start pemu.exe ^ -net nic,vlan1,macaddr…

低功耗接地故障中断器D4145,无需任何电位计符合 U.L.943 标准,直接连接至SCR

概述&#xff1a; D4145 是交流电源插座接地故障中断器的低功率控制器。 在发生有 害或致命冲击前&#xff0c;这些器件检测是否有危险的接地情况&#xff0c;比如设备( 与 AC 线路反相连接) 与水以及与裸露电线接触。内含一个 26V 齐纳并联稳压 器、 一个运算放大器和一个…

实体抽取全解析:技术与实战

目录 一、前言二、实体抽取技术概览基于规则的实体抽取基于统计的实体抽取基于深度学习的实体抽取 三、实体抽取的发展历程早期的实体抽取方法基于规则和词典的方法基于特征的机器学习方法 深度学习时代的实体抽取从传统模型到神经网络序列标注模型的兴起预训练语言模型的革命 …

第十三届蓝桥杯省赛大学B组编程题(c++)

D.刷题统计 二分(AC): 注意:二分时右边界 right 的确定 #include<iostream> using namespace std; long long a,b,n; bool check(long long x){long long tx/7;x%7;long long temp0;if(x<5) tempx*a;else temp5*a(x-5)*b;long long cntt*(5*a2*b)temp;return cnt&g…

第十一届蓝桥杯大赛第二场省赛试题 CC++ 研究生组-七段码

#include<iostream> using namespace std; const int N 10, M 7; int e[N][N] {0}, f[N], open[N];//e[i][j]表示i和j之间是否连通&#xff1b;f[i]表示结点i的父节点&#xff1b;open[i] 1表示结点i打开&#xff0c;0表示关闭 long long ans 0;int find(int x){if(…

水果店加盟哪家好?仙果很忙水果零食店怎么样?

人们越来越重视饮食健康,一些水果类的食品获得了更多消费者的认可。很多投资者也看中了水果店的商机,想要开一家品牌水果店。那么现在水果店加盟哪家好呢!在加盟前,需要了解当前市场的发展潜力,了解哪个项目更值得人们加盟。 健康水果餐饮文化近几年受到了更多消费者的认可,开…

中国网站数量竟然比2022年多了10000个

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 CNNIC发布了最新中国互联网报告&#xff0c;报告显示&#xff1a; 2018年中国有523万个网站&#xff0c;2023年13月下降到388万个&#xff0c;5年时间网站数量下降30%&#xff0c;但相比于2022年12月&#xff0c;竟…

Kyligence 发布企业级 AI 解决方案,Data + AI 落地迈向新阶段

4月11日&#xff0c;Kyligence 2024 数智论坛暨春季发布会成功召开。Kyligence 正式发布全新的企业级 AI 解决方案&#xff0c;基于服务金融、零售、制造、医药等行业领先客户的落地实践&#xff0c;Kyligence 为企业提供准确、可靠、智能的 AI 指标平台一站式解决方案&#x…

分布式系统:缓存与数据库一致性问题

前言 缓存设计是应用系统设计中重要的一环&#xff0c;是通过空间换取时间的一种策略&#xff0c;达到高性能访问数据的目的&#xff1b;但是缓存的数据并不是时刻存在内存中&#xff0c;当数据发生变化时&#xff0c;如何与数据库中的数据保持一致&#xff0c;以满足业务系统…

Excel·VBA二维数组S形排列

与之前的文章《ExcelVBA螺旋数组函数》将一维数组转为二维螺旋数组 本文将数组转为S形排列的二维数组&#xff0c;类似考场座位S形顺序 Function S形排列(ByVal arr, ByVal num_rows&, ByVal num_cols&, Optional ByVal mode$ "row")将数组arr转为num_rows…

【并发】 第四篇 原子操作(一)

导航 一. 非原子操作二. 原子操作1. 使用锁2. 使用原子类一. 非原子操作 首先在并发场景中, 一个线程需要对内存中的某个共享变量的值进行修改时,大致可分为以下三个步骤: # 1.从内存中读取共享变量的值,到线程本地 # 2.执行修改操作 # 3.将修改后的新值,重新写回到内存中此时…

PostgreSQL入门到实战-第十九弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(三)官网地址PostgreSQL概述PostgreSQL中INNER JOIN命令理论PostgreSQL中INNER JOIN命令实战更新计划 PostgreSQL中表连接操作(三) 使用PostgreSQL INNER JOIN子句从多个表中选择数据。 官网地址 声明: 由于操作系统, 版本更新等…

Android 输入法框架

输入法属于输入系统的一部分&#xff0c;区别于输入系统只能向系统产生时间&#xff0c;输入法能向系统输入具体的内容&#xff0c;下面来认识输入法的大体框架&#xff0c;以下内容参考清华大学出版社出版的《Android图形显示系统》。 输入法框架包含3个组件&#xff0c;各组件…

车载视频智能创作解决方案,影视级视频制作

当下车载视频已经不仅仅是一种记录行车过程的方式&#xff0c;更是展现企业品牌形象、传递文化内涵的重要媒介。传统的车载视频制作方式往往耗时耗力&#xff0c;效率低下&#xff0c;无法满足企业对于高质量、高效率的需求。针对这一痛点&#xff0c;美摄科技凭借其在视频智能…

搭建MyBatis框架

文章目录 一、开发环境和准备工作二、创建MyBatis核心配置文件三、创建Mapper接口创建MyBatis的映射文件 四、测试添加用户功能五、日志加入依赖加入log4j的配置文件 六、测试修改功能七、测试删除功能八、测试查询功能根据id查询查询所有信息 一、开发环境和准备工作 MyBatis需…