poj 2492 A Bug's Life

题目链接:http://poj.org/problem?id=2492

题意:给你m对虫子 判断中间有没有同性别在一起的

思路:基础种类并查集

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>

using namespace std;

const int maxn = 10005;
int n, m, T;
int pre[2 * maxn], value[2 * maxn], Rank[2 * maxn];

void init()
{
    for(int i = 0; i <= 2 * n; i++)
    {
        pre[i] = i;
        Rank[i] = 0;
    }
}

int Find(int x)
{
    return x == pre[x] ? x : pre[x] = Find(pre[x]);
}

void uni(int x, int y)
{
    x = Find(x), y = Find(y);
    if(x == y)
    {
        return ;
    }
    if(Rank[x] < Rank[y])
    {
        pre[x] = y;
        return ;
    }
    else
    {
        pre[y] = x;
        if(Rank[x] == Rank[y])
            Rank[x]++;
        return ;
    }
}

bool dif(int x, int y)
{
    if(Find(x + n) == Find(y) || Find(x) == Find(y + n))
    {
        return 1;
    }
    return 0;
}

bool same(int x, int y)
{
    if(Find(x) == Find(y))
    {
        return 0;
    }
    return 1;
}

int main()
{
    int ca;
    cin >> T;
    ca = 1;
    while(T--)
    {
        bool flag = 0;
        cin >> n >> m;
        init();
        for(int i = 0; i < m; i++)
        {
            int a, b, c;
            scanf("%d%d", &a, &b);
            if(flag) continue;
            if(same(a, b) || same(a + n, b + n))
            {
                uni(a + n, b);
                uni(a, b + n);
            }
            else flag = 1;

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

猜你喜欢

转载自blog.csdn.net/k_ona/article/details/79905874