topsort
现在给你n个物种和m条能量流动关系,求其中的食物链条数。
物种的名称为从1到n编号
M条能量流动关系形如
a1 b1
a2 b2
a3 b3
......
am-1 bm-1
am bm
其中ai bi表示能量从物种ai流向物种bi,注意单独的一种孤立生物不算一条食物链
简单但有意思的题目. 只问食物链条数,且符合生物学规定. 一般来说这句话出现的时候就说了是符合拓扑排序的. 计入入度和出度,特判入读和出度都为0.
好了,我这周的报告就完成了.
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int e[N],ne[N],h[N],idx;
int n,m,in[N],out[N];
int res[N];
void add(int a,int b)
{
e[idx] = b,ne[idx] = h[a],h[a] = idx++;
return;
}
void topsort()
{
queue<int> q;
for(int i = 1; i <= n; i++)
if(in[i] == 0)
{
res[i] = 1;
q.push(i);
}
for(int i = 1; i <= n; i++)
if(in[i] == 0 && out[i] == 0)
res[i] = 0;
while(q.size())
{
int t = q.front();
q.pop();
for(int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
in[j]--;
res[j] += res[t];
if(in[j] == 0)
q.push(j);
}
}
}
int main()
{
memset(h,-1,sizeof h);
cin >> n >> m;
while(m--)
{
int a,b;
cin >> a >> b;
add(a,b);
in[b] ++,out[a]++;
}
topsort();
int cnt = 0;
for(int i = 1; i <= n; i++)
if(out[i] == 0)
cnt += res[i];
cout << cnt;
return 0;
}
posted on 2022-01-17 20:04 zzzxxzxzxzxzxz 阅读(82) 评论(0) 编辑 收藏 举报