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编辑  收藏  举报

导航