首页 > 试题广场 >

某地生态系统存在一个复杂的物种事物网

[问答题]
某地生态系统存在一个复杂的物种事物网,科学家们要做一个循环食物链分析,所谓“循环食物链”是指某种物种之间或间接互为食物的关系,先去请:
(1)设计一个数据结构,可以存储完整的食物网
(2)根据在(1)中设计的数据结构,编写一段代码判断一个给定的食物网中是否存在循环食物链
(1)用图来存储食物网
(2)判断有无循环食物链,即判断图中有无环路.可以用拓扑序列来判断.以宽度优先搜索建立拓扑序列,若最后可以建成,说明图中无环;若最后还剩下节点没进入拓扑序列,说明图中有环.

#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;

}


发表于 2017-01-30 02:58:06 回复(0)