Poj 2492 A Bug's Life

Poj 2492 的传送门

题目大意:输入n个bug,bug之间有interaction,当前假设异性之间才interaction,但是需要验证,给定这些interaction对,判定是否满足假设,如果相同则有同性恋,后面就算输入数据也不用做处理了,否则就一直处理下去。

解题思路:并查集,

具体详见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn = 1000005;

int fa[maxn], rank[maxn], num[maxn];
void Init(int x)
{
    for(int i=0; i<=x; i++)
    {
        fa[i] = i;
        num[i] = rank[i] = 0;
    }
}

int Find(int x)
{
    if(fa[x] != x)
        fa[x] = Find(fa[x]);
    return fa[x];
}

void Union(int x, int y)
{
    int fx = Find(x);
    int fy = Find(y);
    if(fx == fy)
        return;
    if(rank[fx] > rank[fy])
        fa[fy] = fx;
    else
    {
        fa[fx] = fy;
        if(rank[fx] == rank[fy])
            rank[fy]++;
    }
}
int main()
{
    int cas;
    bool flag;
    scanf("%d",&cas);
    for(int k=1; k<=cas; k++)
    {
        int m,n,x,y;
        flag = false;
        scanf("%d%d",&m, &n);
        Init(m);

        while(n--)
        {
            scanf("%d%d",&x,&y);
            if(!flag)//4种情况
            {
                if(!num[x] && !num[y])
                {
                    num[x] = y;
                    num[y] = x;
                }
                else if(!num[x] && num[y]!=0)
                {
                    num[x] = y;
                    Union(x, num[y]);
                }
                else if(!num[y] && num[x]!=0)
                {
                    num[y] = x;
                    Union(y, num[x]);
                }
                else if(num[x]!=0 && num[y]!=0)
                {
                    if(Find(x) == Find(y))//在一个集合里,就是同性恋
                        flag = true;
                    Union(x, num[y]);
                    Union(y, num[x]);
                }
            }
        }
        printf("Scenario #%d:\n",k);
        if(flag)
            puts("Suspicious bugs found!");
        else
            puts("No suspicious bugs found!");
        if(k != cas)
            puts("");
    }
    return 0;
}

你可能感兴趣的:(并查集)