HDU1829【种类并查集】

题意:
检验给出条件是否有同性恋。
思路:
条件并查集。
还是一个类似的前缀和,sum[x]是x到根这段路径上的和,根一定是坐标越小的,
那么如果说对于同类(同一个集合)的判断就sum[a]是否等于sum[b]
对于不同类的话,就是他们的关系取反。

考虑状态压缩中,关系就是叠加。
一直wa,wa在Find以后是判断各自的关系。

#include<bits/stdc++.h>
using namespace std;

const int N=2e3+10;
int pre[N],n,sum[N],m;
bool flag;

int Find(int x)
{
    if(pre[x]==x)
        return x;
    int temp=pre[x];
    pre[x]=Find(temp);
    sum[x]=(sum[x]+sum[temp])%2;
    return pre[x];
}

void Merge(int x,int y)
{
    int xx=Find(x);
    int yy=Find(y);
    if(xx==yy)
    {
        if(sum[x]==sum[y])
            flag=false;
    }
    else{
        pre[xx]=yy;
        sum[xx]=(sum[y]+sum[x]+1)%2;    //父子之间不是同性恋;
    }
}

int main()
{
    int T,cas=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<=n;i++)
        {
            pre[i]=i;
            sum[i]=0;
        }
        flag=true;
        while(m--)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            if(!flag) continue;
            Merge(x,y);
        }
        printf("Scenario #%d:\n",cas++);
        if(flag)
            puts("No suspicious bugs found!");
        else
            puts("Suspicious bugs found!");
        puts("");
    }
    return 0;
}


posted @ 2017-02-09 23:55  see_you_later  阅读(175)  评论(0编辑  收藏  举报