不得不说,这是道很难减少时间复杂度的题,且这个题有点像一道拓扑排序题,但是这个难度标签有点低。

我们应该可以想到拓扑排序可能是这个题的正解,但是题目中有输出总数,因此我们就可以造一个数组表示从这个点出发向下有几个食物链,然后最后再输出每个入度为零且出度不为零的点所记忆化搜索到的点的个数。

我们先上70分的代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct zzz{int t,nex;
}e[200010<<1]; int head[100010],tot;
void add(int x,int y){e[++tot].t=y;e[tot].nex=head[x];head[x]=tot;
}
int in[100010],out[100010],vis[100010],ans;
int dfs(int x){if(vis[x]) return vis[x];for(int i=head[x];i;i=e[i].nex){if(out[e[i].t]==0)vis[e[i].t]++;else vis[x]+=dfs(e[i].t);}
}
int main(){int n,m; scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y; scanf("%d%d",&x,&y);in[y]++; out[x]++;add(x,y);}for(int i=1;i<=n;i++){if(in[i]==0&&out[i]){dfs(i);}ans+=vis[i];}cout<<ans;return 0;
}

我们看这个代码觉得这不是加记忆化搜索了吗,为什么还是不够快呢。

因为这个记忆化他只加了一个,就是第一个,可是万一这一个始终实现不了,那就GG了,所以我们应该再加两个,即在每搜索到一个出度为0的点就返回1,且我们应该在遍历完这个点的所有边的时候加完之后再return一个。

所以做完这个题我们应该有了一个教训,便是记忆化搜索能加就加,别吝啬。

代码;

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
struct cym{int u;int v;int next;
}e[200100];
int head[100100],in_degree[100001],out_degree[100010],ans,total,dp[100010];//dp数组表示i这个点向下有几个出度为零的点,也就是有几条食物链
void add(int a,int b)
{e[++total].u=a;e[total].v=b;e[total].next=head[a];head[a]=total;
}
int dfs(int x)
{int num=0;if(dp[x])return dp[x];if(!out_degree[x])return 1;//如果出度为零,就直接加1;for(int i=head[x];i;i=e[i].next)num+=dfs(e[i].v);//向下不断遍历,加上以x为起点的边其终点的dp数组的值 dp[x]=num;return dp[x];
}
int main()
{int n,m,u,v;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);add(u,v);in_degree[v]++;out_degree[u]++;//记录出入度,别记反了。
    }for(int i=1;i<=n;i++)if(!in_degree[i]&&out_degree[i])ans+=dfs(i);//有几个入度为零的点就算几次食物链,比如样例就只算算了一次 cout<<ans;} //@4017

代码后面有彩蛋。

转载于:https://www.cnblogs.com/liuwenyao/p/9236097.html

洛谷P3183食物链题解相关推荐

  1. 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )

    昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...

  2. 洛谷P1816 忠诚 题解

    洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...

  3. 线性存储的最短平均检索时间(洛谷P1253题题解,Java语言描述)

    题目要求 P1253题目链接 分析 很像 ~洛谷P1223题题解~,也是一种类似SJF的贪心法. 排个序,由于两个不大于10000的数,乘起来还是int,就使用int属性吧. 数据量小,所以Scann ...

  4. 队列模拟约瑟夫问题(洛谷P1996题题解,Java语言描述)

    题目要求 P1996题目链接 分析 以前就研究过"约瑟夫环"问题: <单循环链表求解约瑟夫环问题(Java语言描述)> <杀人游戏~约瑟夫环(洛谷P1145题题解 ...

  5. 洛谷P2108学英语题解

    来我的博客里拥有更好的阅读体验:https://yyxi.ml/2020/07/23/luogu-p2108-xueyingyu/ 洛谷P2108学英语题解(c++) 题目描述 代码.思路 踩过的坑 ...

  6. 洛谷 P1077 摆花 题解

    洛谷 P1077 摆花 题解 洛谷 P1077 题目 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共mmm盆.通过调查顾客的喜好,小明列出了顾客最喜欢的nnn种花,从1到nnn标号.为 ...

  7. 洛谷 最大食物链计数 python题解

    题目:P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 给你一个食物网,你要求出这个食物网中最大食物链的数量. (这里的"最大食物链&q ...

  8. 修改数组(洛谷P7285题题解,C++语言描述)

    题目要求 P7285题目链接 分析 这题虽然是红题,但是因为很有趣且是 Special Judge ,所以写篇题解. 乍一看,这题好麻烦啊,要综合考虑xxx和yyy,达到x−yx-yx−y的最优化. ...

  9. 枚举求解单词方阵(洛谷P1101题题解,Java语言描述)

    题目要求 P1101题目链接 分析 可以用DFS做,但我立下了个Flag,所以就用了朴素的枚举来做.... 结果,我的天哪,做了好几个小时-- 其实这种地图题,真的适合 DFS or BFS or D ...

最新文章

  1. 把32位的SharePoint服务器场迁移到64位, 应该怎么做?
  2. mysql取最接近的两个值_Mysql:获取一行中另一个字段的最高值和最...
  3. inet_ntop php,inet_ntop()
  4. 一元操作符和使用Number()方法的区别
  5. python带通滤波_python中的fft带通滤波器
  6. P4175 [CTSC2008]网络管理(整体二分)
  7. NGINX原理 之 SLAB分配机制(转)
  8. java 获取本机的IP和hostname
  9. 百万级MySQL的数据量,该如何快速的完成数据迁移?
  10. stardict安装及其他
  11. 与孩子一起学编程14章
  12. MATLAB中Imcrop函数的用法
  13. 如何选择剑桥英语KET,PET课程和老师
  14. sonar入门:全网最全的概念解析与安装
  15. ios 图片加载内存尺寸_iOS内存分析上-图片加载内存分析
  16. linux大于3T硬盘多个分区,Ubuntu挂载3T硬盘或大于2T磁盘的方法
  17. Verdi 知识体系
  18. redis 穿透、雪崩、击穿
  19. 计算机天才陈立杰:16岁拒上清华,婉拒谷歌,网瘾少年如何逆袭?
  20. ANSYS APDL学习(7):给平面绘制圆角

热门文章

  1. php和java融合_JSP、PHP与JAVA融合的开发环境之二
  2. 翟萍python程序设计_Python程序设计(高等学校计算机教育规划教材)
  3. mysql的别名可以动态么_mysql别名的使用
  4. apache php mysql是长连接吗_php关于mysql长连接问题
  5. PHPExcel报错:谷歌浏览器显示网页可能暂时无法连接,或者它已永久性地移动到了新网址的原因?
  6. 每天一个linux命令(23):Linux 目录结构
  7. 【分组并查集讲解】A Bug‘s Life(例题)
  8. python【数据结构与算法】选数问题(指定值求和——递归)
  9. 【Network Security!】密码攻击的原理和方法
  10. mysql编辑表php源码_MySQL修改表的实际应用代码示例