POJ 2492 A Bug's Life(种类并查集)

传送门

题目意思就是 给定n只虫子 不同性别的可以在一起 相同性别的不能在一起
给你m对虫子 判断中间有没有同性别在一起的;
我们把同性的放到一个集合里 如果一个集合里出现了异性 则说明存在同性恋在一起
假设 x 为一种性别 x+n为与其相反的性别  
若a,b为同性 的  我们则可以把判断 (a,b+n)  (b,a+n)为异性反之亦然;
代码如下

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 5010;
int pre[maxn];
void init(int n)
{
    for(int i = 0;i <= n; i++)
        pre[i] = i;
}
int findx(int x)
{
    if(x == pre[x])
        return x;
    return findx(pre[x]);
}
void marge(int x,int y)
{
    x = findx(x);
    y = findx(y);
    if(x != y)
        pre[x] = y;
}
int judge(int x,int y)
{
    x = findx(x);
    y = findx(y);
    if(x != y)
        return 1;
    return 0;
}
int main()
{
    int t,cas = 1;
    scanf("%d",&t);
    while(t--)
    {
        int n,m,l = 1;
        scanf("%d %d",&n,&m);
        init(2 * n);
        for(int i = 0;i < m; i++)
        {
            int x,y;
            scanf("%d %d",&x,&y);
            if(judge(x,y) || judge(x+n,y+n))
            {
                marge(x,y+n);
                marge(y,x+n);
            }
            else    l = 0;
        }
        if(cas != 1)
            printf("\n");
        printf("Scenario #%d:\n",cas++);
        if(l)
            printf("No suspicious bugs found!\n");
        else
            printf("Suspicious bugs found!\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xiao__hei__hei/article/details/87513075
今日推荐