链接: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;
}