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

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

我们先上70分的代码

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

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

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

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

代码;

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
struct cym{
int u;
int v;
int next;
}e[];
int head[],in_degree[],out_degree[],ans,total,dp[];//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=;
if(dp[x])
return dp[x];
if(!out_degree[x])
return ;//如果出度为零,就直接加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=;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
in_degree[v]++;
out_degree[u]++;//记录出入度,别记反了。
}
for(int i=;i<=n;i++)
if(!in_degree[i]&&out_degree[i])
ans+=dfs(i);//有几个入度为零的点就算几次食物链,比如样例就只算算了一次
cout<<ans;
} //@4017

代码后面有彩蛋。

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

  1. 洛谷NOIp热身赛题解

    洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...

  2. 洛谷P2827 蚯蚓 题解

    洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...

  3. 洛谷P1816 忠诚 题解

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

  4. 洛谷P2024 食物链

    挺神奇 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种 ...

  5. [POI 2008&洛谷P3467]PLA-Postering 题解(单调栈)

    [POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长 ...

  6. [NOI 2020 Online] 入门组T1 文具采购(洛谷 P6188)题解

    原题传送门 题目部分:(来自于考试题面,经整理) [题目描述] 小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品: 1.圆规,每个 7 元. 2.笔,每支 4 元. 3.笔记本,每本 ...

  7. [洛谷P3948]数据结构 题解(差分)

    [洛谷P3948]数据结构 Description 最开始的数组每个元素都是0 给出n,opt ,min,max,mod 在int范围内 A: L ,R ,X 表示把[l,R] 这个区间加上X(数组的 ...

  8. [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)

    [CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...

  9. 洛谷P1189 SEARCH 题解 迭代加深

    题目链接:https://www.luogu.com.cn/problem/P1189 题目大意: 给你一个 \(n \times m\) 的矩阵,其中有一些格子可以走,一些各自不能走,然后有一个点是 ...

随机推荐

  1. 深入理解Redis Cluster

    Redis Cluster采用虚拟槽分区,所有的key根据哈希函数映射到0~16383槽内,计算公式: slot = CRC16(key) & 16383 每个节点负责维护一部分槽以及槽所映射 ...

  2. Docker 最佳入门

    https://www.cnblogs.com/lanxiaoke/p/10432631.html https://www.cnblogs.com/viter/p/10463907.html http ...

  3. linux下的shell脚本(基本)

    shell有些命令和格式不用老是容易忘,学而时习之,不亦说乎~ 先说明以下内容来自: http://c.biancheng.net/cpp/shell/ ,C语言中文网,请大家支持原作,点击链接查看. ...

  4. python3 pip 安装Scrapy在win10 安装报错error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

    问题描述 当前环境win10,python_3.6.1,64位. 在windows下,在dos中运行pip install Scrapy报错: building 'twisted.test.raise ...

  5. H5 70-清除浮动方式五

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. UVA-10375 唯一分解定理

    #include<iostream> #include<string.h> #include<algorithm> #include<math.h> # ...

  7. PS调出唯美冷色情侣婚纱写真照

    一.打开PS原片,原片是一张JPG格式的片子 色温较高整个画面较红离对着上面的我们标准的韩式色调我们来进行调节吧 ,我就不打太多文字解释一些基本常规了 二.韩式婚纱内景喜欢加点烟雾.其实我本人是不太喜 ...

  8. C#使用ES

    C#如何使用ES Elasticsearch简介 Elasticsearch (ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为 ...

  9. Django之admin中管理models中的表格

    Django之admin中管理models中的表格 django中使用admin管理models中的表格时,如何将表格注册到admin中呢? 具体操作就是在项目文件夹中的app文件夹中的admin中注 ...

  10. IdentityServer4【QuickStart】之使用ResourceOwnerPassword流程来保护API

    使用ResourceOwnerPassword流程来保护API OAuth2.0中的ResourceOwnerPassword授权流程允许一个客户端发送username和password到token服 ...