首页 > 代码库 > POJ 2492 A Bug's Life

POJ 2492 A Bug's Life

题意:给你一个n m,n代表有多少只昆虫,m代表2只给定的昆虫可以交配

要你来判断是否出现了同性的昆虫相交的情况

思路:并查集的一个小的应用。运用类别转移来做,详细请看代码,这个代码网上叫类别转移啊,发现新大陆了

#include<stdio.h>
#include<string.h>
int f[2005],link[2005];
int find(int x)
{
    if(x!=f[x])
        f[x]=find(f[x]);
    return f[x];
}
void make(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y)
        return ;
    f[y]=x;
}
int main()
{
    int a,b,i,n,m,flag,t,cnt=1;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&n,&m);
        for(i=1;i<=n;i++)
        {
            link[i]=0;
            f[i]=i;
        }
        flag=0;
        while(m--)
        {
            scanf("%d %d",&a,&b);
            if(flag)
                continue;
            int x,y;
            x=find(a);
            y=find(b);
            if(x==y)
                flag=1;
            if(link[x]==0&&link[y]==0)  //如果2个数跟谁都还没有关系
            {
                link[x]=y;      //确定关系
                link[y]=x;
            }
            else if(link[x]==0)
            {
                link[x]=y;  
                make(x,link[y]);    //将link[y]的父节点找出来,将x的值给f[y],只要再次出现x或是x的集合种的
            }                       //那只虫,那么我们就找到了同类相交的情况
            else if(link[y]==0)
            {
                link[y]=x;
                make(y,link[x]);
            }
            else
            {
                make(x,link[y]);
                make(y,link[x]);
            }

        }
        printf("Scenario #%d:\n",cnt++);
        if(flag)
            printf("Suspicious bugs found!\n\n");
        else
            printf("No suspicious bugs found!\n\n");
    }
    return 0;
}