POJ 2492 A Bug's Life 并查集

题目大意:有n个虫子,m个数据,每行数据有a,b两个虫子,意味着a,b可以交配。为有没有同性恋……

题目思路:并查集,每次加入的a,b如果father[a]和father[b]相同,就通过判断relation[a]和relation[b]是否相等来确定是否存在同性恋,不同则进行更新。

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0x3f3f3f3f
#define MAX 2200

using namespace std;

int father[MAX],relation[MAX],ok;//relation[i]记录i与根节点的性别是否相同

int Find(int x)
{
    int k;

    if(x==father[x])
        return x;
    k=Find(father[x]);
    relation[x]=relation[x]^relation[father[x]];
    return father[x]=k;
}
int main()
{
    int i,j,n,m,T,a,b,cnt=1;

    scanf("%d",&T);

    while(T--)
    {
        ok=1;

        scanf("%d%d",&n,&m);

        memset(relation,0,sizeof(relation));

        for(i=0; i<MAX; i++)
            father[i]=i;

        for(i=1; i<=m; i++)
        {
            scanf("%d%d",&a,&b);

            if(!ok)
                continue;
            int x=Find(a);
            int y=Find(b);

            if(x==y)
            {
                ok=relation[a]^relation[b];//若a,b与根节点的性别都相同或都不相同,则a,b为同性恋
            }

            else
            {
                father[x]=y;
                int k=(relation[a]^relation[b]);
                if(k)
                    relation[x]=0;
                else
                    relation[x]=1;
            }
        }

        printf("Scenario #%d:\n",cnt++);

        if(!ok)
            printf("Suspicious bugs found!\n\n");
        else
            printf("No suspicious bugs found!\n\n");

    }
    return 0;
}
View Code

 

posted @ 2016-08-24 22:31  声声醉如兰  阅读(133)  评论(0编辑  收藏  举报