牛客 [HAOI2016]食物链(拓扑排序,记忆化搜索,bfs)

链接:https://ac.nowcoder.com/acm/problem/20000
来源:牛客网

题目描述

如图所示为某生态系统的食物网示意图,据图回答第1小题
现在给你n个物种和m条能量流动关系,求其中的食物链条数。
物种的名称为从1到n编号
M条能量流动关系形如
a1 b1
a2 b2
a3 b3

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

输入描述:

第一行两个整数n和m,接下来m行每行两个整数ai,bi描述m条能量流动关系。 (数据保证输入数据符号生物学特点,且不会有重复的能量流动关系出现)
1 ≤ N ≤ 100000,0 ≤ m ≤ 200000
题目保证答案不会爆 int

输出描述:

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

示例1
输入
复制

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

输出
复制

9

分析:

记录到每个动物的食物链条数,最后统计食物链终点的条数之和,注意单个动物不算一条食物链

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5+10;
vector<int> q[N];
int in[N],n,f[N],vis[N],d[N];
void topsort()
{
	queue<int> s;
	for(int i=1;i<=n;i++)
	{
		if(in[i]==0)
		{
			s.push(i);
			f[i]=1;
		} 
	}
	while(!s.empty())
	{
		int t=s.front();
		s.pop();
		for(int i=0;i<q[t].size();i++)
		{
			int v=q[t][i];
			in[v]--;
			f[v]+=f[t];
			if(in[v]==0)
			{
				s.push(v);
			}
		}
	}
}
int main()
{
	int m;
	int x,y;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		in[y]++,vis[x]=1,d[y]=1;
		q[x].push_back(y);
	}
	topsort();
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(!vis[i]&&d[i])
		ans+=f[i];
	}
	if(n==1) ans=0;
	printf("%d",ans);
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值