寒假集训专题三 G.食物链


食物链

https://loj.ac/p/2060

题意

有n个物种,m条能量流动关系,求其中的食物链条数

思路

把他看成一项工程,完成顺序为从入度为0点开始到出度为0的点,求出从入到出的所有方案数。

首先用拓扑排序的思想,遍历入度到出度的所有点,给刚开始入度为0的点赋值为1,用记忆化的方法,在遍历的情况下更新每个结点的方法数,最后记录出度为0结点方法数的总和。

#include
using namespace std;
const int N= 1e5+7;
int n;
int in[N];
int out[N];
int shuz[N];
vector ans;
vector g[N]; 
vector ve;
void toupu()
{
	memset(shuz,0,sizeof(shuz));
	queue que;
	for(int i=1;i<=n;i++)
	{
		if(in[i]==0&&out[i]!=0)		//排除没有出度入度的
		{
			que.push(i);
			shuz[i]=1;
		}
		if(in[i]!=0&&out[i]==0)
		{
			ve.push_back(i);
		}
		 
	}
	while(que.size())
	{
		int u=que.front();que.pop();
		ans.push_back(u);
		for(int i=0;i>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		g[u].push_back(v);
		in[v]++;
		out[u]++;
	}
	toupu();
}