首页 > 其他 > 详细

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

时间:2020-02-08 17:12:14      阅读:70      评论:0      收藏:0      [点我收藏+]
//有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");
    }
}

 

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

原文:https://www.cnblogs.com/QingyuYYYYY/p/12283216.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!