每日一题冲刺大厂第二十天提高组 最大食物链计数

简介: 大家好,我是泡泡,给大家带来每日一题的目的是为了更好的练习算法,我们的每日一题提高组是为了有余力的同学准备的,让大家练到各种各样的题目,一年以后,蜕变成为一个不一样的自己!

今日题目:食物链


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


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


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


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


输入格式


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


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


输出格式


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


题目分析


题目难度:⭐️⭐️⭐️


题目涉及算法:拓扑排序,记忆化搜索。


ps:有能力的小伙伴可以尝试优化自己的代码或者一题多解,这样能综合提升自己的算法能力


题解报告:


1.思路


拓扑排序的板子,数据范围不大所以开了个二维数组哈哈哈,第二个是记忆化搜索


2.代码


#include<bits/stdc++.h>
using namespace std;
const int N = 5005; 
int n,m,ru[N],chu[N],a,b,f[N],ans;
int mp[N][N];
queue<int>q;
int main()
{
  cin>>n>>m;
  for(int i=1;i<=m;i++)
  {
    cin>>a>>b;
    mp[a][b]=1;
    chu[a]++;
    ru[b]++;
  }
  for(int i=1;i<=n;i++)
  {
    if(ru[i]==0)
    {
      f[i]=1;
      q.push(i);
    }
  }
  while(!q.empty())
  {
    int a=q.front();
    q.pop();
    for(int k=1;k<=n;k++)
    {
      if(mp[a][k]==0)
      {
        continue;
      }
      f[k]+=f[a];
      f[k]%=80112002;
      ru[k]--;
      if(ru[k]==0)
      {
        if(chu[k]==0)
        {
          ans+=f[k];
          ans%=80112002;
                    continue;
        }
        q.push(k);
      }
    }
  }
  cout<<ans; 
}


记忆化搜索:


一共五条食物链 ,通过对图观察能够发现一条完整的食物链最高级消费者是没有被吃过的,而生产者和低级别的消费者是会被吃过,所以可以设置两个标记数组来表示被吃过与吃过的。


创建了这两个数组之后我们就要着手将他们的关系存下来了,因此我们可以创建一个结构体数组用来表示吃与被吃的关系,然后选择找到相对的关系而不是循环遍历,就能避免tle


#include<bits/stdc++.h>
using namespace std;
const int N = 5005; 
int n,m,c[N];
int w[N],u[N],ans,c2[N];
int j=1;
struct node{
  int x,y,next;
}mp[500005];
int dfs(int t)
{ 
  int num=0;
  if(!u[t])
  {     
    return 1;
  }
  if(c[t])
  {
    return c[t];
  }
  for(int i=c2[t];i;i=mp[i].next)
  {
    (num+=dfs(mp[i].x))%=80112002;
  }
  return c[t]=num;
}
int main()
{
  cin>>n>>m;
  while(m--)
  {
    int a,b;
    cin>>a>>b;
    w[a]=1;
    u[b]=1;
    mp[j].x=a;
    mp[j].y=b;  
    mp[j].next=c2[b];
    c2[b]=j;
    j++;
  }
  for(int i=1;i<=n;i++)
  {
    if(!w[i])
    {
      (ans+=dfs(i))%=80112002;
    }
  }
  cout<<ans;
}


目录
相关文章
|
2月前
|
运维 数据可视化 搜索推荐
什么是低代码?低代码和无代码的区别,以及低代码的用户是谁?
低代码是一种通过可视化界面和拖拽操作,减少手动编码、提升应用开发效率的开发方式。它既服务于专业开发者,也适用于无编程经验的业务人员,助力企业快速实现数字化转型。
|
5月前
|
人工智能 安全 Linux
Burp Suite Professional 2025.5 发布,新增功能简介
Burp Suite Professional 2025.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
283 4
|
3月前
|
存储 安全 数据安全/隐私保护
如何快速部署 ERPNext 多版本?
本文介绍了 ERPNext 多版本快速部署的几种方法,包括基于 Docker 的容器化部署、使用 websoft9 工具的一键部署以及虚拟机部署方案。每种方法适用于不同场景,如功能测试、非技术用户操作或高隔离需求环境。同时涵盖多版本使用的典型场景,如升级测试、团队并行使用和插件兼容性验证,并强调资源分配、数据备份、安全防护等注意事项,助力企业高效管理 ERPNext 多版本应用。
|
存储 自然语言处理 关系型数据库
【洛谷 P1088】[NOIP2004 普及组] 火星人 题解(全排列+向量)
**火星人问题摘要:** NOIP2004普及组竞赛中的题目,涉及火星人用手指的排列表示数字。人类需计算火星人数字与给定数值之和的新排列。给定火星人手指数N(≤10000),加上的数M(≤100),以及初始排列,要求输出新排列。30%的数据中N≤15,60%的数据中N≤50。使用`next_permutation`函数找到第M个排列。样例:N=5, M=3, 初始排列1 2 3 4 5,输出1 2 4 5 3。
210 0
|
存储 缓存 测试技术
现代化实时数仓 SelectDB 再次登顶 ClickBench 全球数据库分析性能排行榜!
近日,在 ClickHouse 发起的分析型数据库性能测试排行榜 ClickBench(https://benchmark.clickhouse.com/)中,现代化实时数仓 SelectDB 时隔两年后再次登顶,在全部近百款数据库和数十种机型中,性能表现位居总榜第一!
497 1
|
程序员
如何成为高质量程序猿与软件质量的十个指标:正确性、健壮性、可靠性、性能、易用性、清晰性、安全性、可扩展性、兼容性和可移植性
如何成为高质量程序猿与软件质量的十个指标:正确性、健壮性、可靠性、性能、易用性、清晰性、安全性、可扩展性、兼容性和可移植性
468 0
|
机器学习/深度学习 传感器 自动驾驶
【Python机器学习专栏】深度学习在自动驾驶中的应用
【4月更文挑战第30天】本文探讨了深度学习在自动驾驶汽车中的应用及其对技术发展的推动。深度学习通过模拟神经网络处理数据,用于环境感知、决策规划和控制执行。在环境感知中,深度学习识别图像和雷达数据;在决策规划上,学习人类驾驶行为;在控制执行上,实现精确的车辆控制。尽管面临数据需求、可解释性和实时性挑战,但通过数据增强、规则集成和硬件加速等方法,深度学习将持续优化自动驾驶性能,并在安全性和可解释性上取得进步。
355 0
|
存储 测试技术 Linux
存储稳定性测试与数据一致性校验工具和系统
LBA tools are very useful for testing Storage stability and verifying DATA consistency, there are much better than FIO & vdbench's verifying functions.
1530 0
|
编解码 调度 Android开发
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
1678 0