某地生态系统存在一个复杂的物种事物网,科学家们要做一个循环食物链分析,所谓“循环食物链”是指某种物种之间或间接互为食物的关系,先去请: (1)设计一个数据结构,可以存储完整的食物网 (2)根据在(1)中设计的数据结构,编写一段代码判断一个给定的食物网中是否存在循环食物链
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
int v, a, from, to, T, flag;//v:生物种类 a:食物链单向捕食关系数量
int in[510000], vis[510000];
struct node//邻接表的节点
{
int num;
node *next;
node(){
next = NULL;
}
};
struct LIST//邻接表
{
int num;
node *next;
void insert(int num)
{
node *t = new node;
t->num = num;
t->next = next;
next = t;
}
}l[510000];
int main()
{
scanf("%d",&T);
while(T--)
{
flag = 0;
scanf("%d%d",&v,&a);//输入食物网,建立图。
queue<int>q;
memset(in,0,sizeof(in));
memset(vis,0,sizeof(vis));
memset(l,0,sizeof(l));
while(a--)
{
scanf("%d%d",&from,&to);
in[to]++;//入度+1
l[from].insert(to);
}
for(int i=1;i<=v;i++)
{
if(in[i]==0 && vis[i]==0)//入度为0的点进入拓扑序列
{
vis[i] = 1;
q.push(i);
}
}
while(!q.empty())
{
int temp = q.front(); q.pop();
node *t = new node;
t = l[temp].next;
while(t)
{
in[t->num]--;
if(in[t->num]==0 && vis[t->num]==0)
{
vis[t->num] = 1;
q.push(t->num);
}
t = t->next;
}
}
for(int i=1;i<=v;i++)
if(vis[i]==0)//还有点未进入拓扑序列
{
flag = 1; break;
}
if(flag)//有环
printf("Yes\n");
else//无环
printf("No\n");
}
return 0;
}