HDU1829【种类并查集】

来源:互联网 发布:yankee 知乎 编辑:程序博客网 时间:2024/06/08 06:13
题意:
检验给出条件是否有同性恋。
思路:
条件并查集。
还是一个类似的前缀和,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;}


0 0