洛谷P3183食物链题解
不得不说,这是道很难减少时间复杂度的题,且这个题有点像一道拓扑排序题,但是这个难度标签有点低。
我们应该可以想到拓扑排序可能是这个题的正解,但是题目中有输出总数,因此我们就可以造一个数组表示从这个点出发向下有几个食物链,然后最后再输出每个入度为零且出度不为零的点所记忆化搜索到的点的个数。
我们先上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食物链题解的更多相关文章
- 洛谷NOIp热身赛题解
洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...
- 洛谷P2827 蚯蚓 题解
洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...
- 洛谷P1816 忠诚 题解
洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...
- 洛谷P2024 食物链
挺神奇 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种 ...
- [POI 2008&洛谷P3467]PLA-Postering 题解(单调栈)
[POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长 ...
- [NOI 2020 Online] 入门组T1 文具采购(洛谷 P6188)题解
原题传送门 题目部分:(来自于考试题面,经整理) [题目描述] 小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品: 1.圆规,每个 7 元. 2.笔,每支 4 元. 3.笔记本,每本 ...
- [洛谷P3948]数据结构 题解(差分)
[洛谷P3948]数据结构 Description 最开始的数组每个元素都是0 给出n,opt ,min,max,mod 在int范围内 A: L ,R ,X 表示把[l,R] 这个区间加上X(数组的 ...
- [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)
[CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...
- 洛谷P1189 SEARCH 题解 迭代加深
题目链接:https://www.luogu.com.cn/problem/P1189 题目大意: 给你一个 \(n \times m\) 的矩阵,其中有一些格子可以走,一些各自不能走,然后有一个点是 ...
随机推荐
- .Net Core 在 Linux-Centos上的部署实战教程(一)
pa我是在VS2017上写好项目然后来部署的,我的宗旨能截图就少BB 服务器系统: Asp.Net Core版本: 1.往服务器安装.net core 2.1 https://www.microsof ...
- 领域驱动设计(DDD:Domain-Driven Design) 介绍
Eric Evans的“Domain-Driven Design领域驱动设计”简称DDD,Evans DDD是一套综合软件系统分析和设计的面向对象建模方法,本站Jdon.com是国内公开最早讨论DDD ...
- python实现本地图片上传到服务区
本地图片上传到服务器,其本质上来讲,就是读取本地图片,复制到服务器,并返回服务器url 前端代码,用的form表单提交,form表单中包含两个文件选择表单元素,选择文件,点击提交按钮,提交form表单 ...
- Django 的路由层 视图层 模板层
--------------------------------------------------------------通过苦难,走向欢乐.——贝多芬 Django-2的路由层(URLconf) ...
- Codeforces Round #521 (Div. 3)
B 题过的有些牵强,浪费了很多时间,这种题一定想好思路和边界条件再打,争取一发过. D 题最开始读错题,后面最后发现可以重复感觉就没法做了,现在想来,数据量大,但是数据范围小枚举不行,二分还是可以的 ...
- Node.js api接口和SQL数据库关联
数据库表创建 服务器环境配置.连接 .操作.数据库 API接口 原则:
- 钢琴培训班课程、课时及费用管理系统已提供ACM3.0新版下载
中小型艺术培训班课程.课时及费用管理系统. 2014新版 ACM3测试版下载:http://www.cnblogs.com/Charltsing/p/ACM3.html 您有任何功能需求,欢迎QQ 5 ...
- Masonry练习详解
添加约束的方式: 1.通过使用NSLayoutConstraints添加约束到约束数组中,之前必须设置translatesAutoresizingMaskIntoConstraints = NO,即取 ...
- Django之Django终端打印SQL语句
Django之Django终端打印SQL语句 在Django项目中,settings.py文件中,在最后添加如下代码即可实现在Django终端打印SQL语句. LOGGING = { 'version ...
- rest-framework序列化
快速实例 Quickstart 序列化 开篇介绍: ---- 一切皆是资源,操作只是请求方式 ----book表增删改查 /books/ books /books/add/ addbook /book ...