【BZOJ-4562】食物链 记忆化搜索(拓扑序 + DP)

4562: [Haoi2016]食物链

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 133  Solved: 112
[Submit][Status][Discuss]

Description

如图所示为某生态系统的食物网示意图,据图回答第1小题

现在给你n个物种和m条能量流动关系,求其中的食物链条数。

物种的名称为从1到n编号

M条能量流动关系形如

a1 b1

a2 b2

a3 b3

......

am-1 bm-1

am bm

其中ai bi表示能量从物种ai流向物种bi,注意单独的一种孤立生物不算一条食物链

Input

第一行两个整数n和m,接下来m行每行两个整数ai bi描述m条能量流动关系。

(数据保证输入数据符号生物学特点,且不会有重复的能量流动关系出现)

1<=N<=100000 0<=m<=200000

题目保证答案不会爆 int

Output

一个整数即食物网中的食物链条数

Sample Input

10 16
1 2
1 4
1 10
2 3
2 5
4 3
4 5
4 8
6 5
7 6
7 9
8 5
9 8
10 6
10 7
10 9

Sample Output

9

HINT

Source

Solution

就是找入度为0的点,到出度为0的点的路径数

可以拓扑一下DP,也可以直接记搜(记搜竟然比DP快?!)

PS:符合生物学的规律?生物学啥规律来着?单向流动、逐级递减?

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int read()
{
    int x=0,f=1; char ch=getchar();
    while (ch<‘0‘ || ch>‘9‘) {if (ch==‘-‘) f=-1; ch=getchar();}
    while (ch>=‘0‘ && ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();}
    return x*f;
}
#define maxn 100010
#define maxm 200010
int n,m,zt[maxn],ans,outd[maxn],ind[maxn];
bool visit[maxn];
struct EdgeNode{int from,to,next;}edge[maxm];
int head[maxn],cnt=1;
void insert(int u,int v)
{
    cnt++;edge[cnt].next=head[u];head[u]=cnt;edge[cnt].from=u;edge[cnt].to=v;
}
int DFS(int x)
{
    if (visit[x]) return zt[x];
    visit[x]=1;
    if (!outd[x]) {zt[x]=1;return 1;}
    int re=0;
    for (int i=head[x]; i; i=edge[i].next)
        re+=DFS(edge[i].to);
    zt[x]=re; return re;
}
int main()
{
    n=read(),m=read();
    for (int u,v,i=1; i<=m; i++)
        u=read(),v=read(),ind[v]++,outd[u]++,insert(u,v);
    for (int i=1; i<=n; i++) if (!ind[i]&&outd[i]) ans+=DFS(i);
    printf("%d\n",ans);
    return 0;
}

轻松1A系列

时间: 2024-10-01 07:29:52

【BZOJ-4562】食物链 记忆化搜索(拓扑序 + DP)的相关文章

bzoj4562: [Haoi2016]食物链--记忆化搜索

这道题其实比较水,半个小时AC= =对于我这样的渣渣来说真是极大的鼓舞 题目大意:给出一个有向图,求入度为0的点到出度为0的点一共有多少条路 从入读为零的点进行记忆化搜索,搜到出度为零的点返回1 所有返回值加起来就是答案. “注意单独的一种孤立生物不算一条食物链.”出题人都这么好心的说了,然而第一次交的时候还是忘了= =结果成为此题第一个WA的人hh 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm&g

LuoguP3183 [HAOI2016]食物链 记忆化搜索

题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数.物种的名称为从1到n编号M条能量流动关系形如a1 b1a2 b2a3 b3......am-1 bm-1am bm其中ai bi表示能量从物种ai流向物种bi,注意单独的一种孤立生物不算一条食物链 输入输出格式 输入格式: 第一行两个整数n和m,接下来m行每行两个整数ai bi描述m条能量流动关系.(数据保证输入数据符号生物学特点,且不会有重复的能量流动关系出现)1<=N<=1

bzoj 1415 期望+记忆化搜索 ****

1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11

HDU 1978 记忆化搜索(dfs+dp)

Y - How many ways Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1978 Appoint description: Description 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下: 1.机器人一开始在棋盘的起始点并有起始点所标有的能量. 2.机器

URAL 1152. False Mirrors (记忆化搜索 状压DP)

题目链接 题意 : 每一颗子弹破坏了三个邻近的阳台.(第N个阳台是与第1个相邻)射击后后的生存的怪物都对主角造成伤害- 如此,直到所有的怪物被消灭,求怎样射击才能受到最少伤害. 思路 : 状压,数据不是很大,可以爆一爆,或者DFS下去就行,枚举每一种状态. 1 //1152 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #define oo 1 << 28 6 using n

背包问题 (记忆化搜索)

使用记忆化搜索,可大大提升时间效率.... 1 int n,W;//n为重量 2 int w[MAX],v[MAX]; 3 int dp[MAX][MAX]; 4 5 //从第i个物品开始挑选总重小于j的部分 6 int rec(int i,int j) 7 { 8 //记忆化搜索 9 /*if(dp[i][j] >= 0){ 10 return dp[i][j]; 11 }*/ 12 int rec; 13 if(i==n){ 14 //已经没有剩余物品了 15 rec=0; 16 } 17

UVALive 6470 Chomp --记忆化搜索

题意:给一个只有三行的方块阵(横向最多100个),然后p,q,r分别代表第1,2,3层的方格数,两人轮流去掉一个格子,此时这个格子的右上方都会被去掉,面临只剩最左下角的一个格子的状态的人输,问先手能否赢,要赢得话应该取哪个方格. 解法:记忆化搜索,设dp[p][q][r]表示第1,2,3层方格数分别为p,q,r的输赢状态,0为输,1为赢,X[][][],Y[][][]分别表示其该取的方格坐标.每次求dp[p][q][r]时,枚举能达到的状态,如果这些状态的输赢值有一个为输,则此状态一定为赢,返回

记忆化搜索+DFS URAL 1183 Brackets Sequence

题目传送门 1 /* 2 记忆化搜索+DFS:dp[i][j] 表示第i到第j个字符,最少要加多少个括号 3 dp[x][x] = 1 一定要加一个括号:dp[x][y] = 0, x > y; 4 当s[x] 与 s[y] 匹配,则搜索 (x+1, y-1); 否则在x~y-1枚举找到相匹配的括号,更新最小值 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cmath> 9 #include

wenbao与记忆化搜索

记忆化搜索: 通俗地讲就是搜索的形式,dp的思想 一些搜索难以完成,dp的动态转移方程又不好写的题,就会用到记忆化搜索,利用dp记录路径(相当于为dfs剪枝)用dfs进行模拟.. 啦啦啦啦啦啦,,,,,,,,,好厉害!!!!!! @ https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1059 弱鸡代码 1 #include <strin