A Bug's Life HDU - 1829 种类并查集

//有n个成员,并查集开两倍空间
//1~n为一组, n+1~2n为一组。a与b互斥,则a与b反(即b+n)为同一集合,
//同时b与a反(a+n)为同一集合

//在union操作中,引入w ,w越大,表面它的根连接的点越多 
//合并时确立关系 
#include<iostream>
using namespace std;
const int N=1e6;
int p[N];
int w[N];
int find(int x)
{
    if(p[x]!=x)
        p[x]=find(p[x]);
    return p[x];
}
void unite(int x, int y)
{
    int px=find(x),py=find(y);
    if (px==py) 
        return;
    else if(w[px]>w[py])
        p[py] = px;
    else
    {
        p[px]=py;
        if (w[px]==w[py]) 
            w[py]+=w[px];
    }
}
bool judge(int x,int y)
{
    int px=find(x);
    int py=find(y);
    return px==py;
}
int main()
{
    int t;
    cin>>t;
    int cnt=0;
    int n,m;
    while(t--)
    {
        bool flag=1;
        cin>>n>>m;
        for(int i=1;i<=2*n;i++)
            p[i]=i,w[i]=1;
        int a,b;
        for(int i=0;i<m;i++)
        {
            cin>>a>>b;
            if (judge(a,b)||judge(a,b+n))
            {
                if (judge(a,b))
                    flag=false;
                //是异性则符合条件继续 
                else 
                    continue;
            }
            else
            {
                unite(a, b+n);
                unite(a+n, b);
            }
        }
        printf("Scenario #%d:\n",++cnt);
        if(!flag) 
            printf("Suspicious bugs found!\n\n");
        else 
            printf("No suspicious bugs found!\n\n");
    }
}

 

posted @ 2020-02-08 14:01  晴屿  阅读(128)  评论(0编辑  收藏  举报