poj1703(种类并查集)

题目大意:警察抓获N个罪犯,这些罪犯只可能属于两个团伙中的一个,现在给出M个条件(D a b表示a和b不在同一团伙),
对于每一个询问(A a b)确定a,b是不是属于同一团伙或者不能确定。
 
思路:如果父亲和孩子是同一个团伙,那么孩子标记为0,如果不是的话,孩子标记为1.然后就是种类并查集的事情了......不难
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define M 100005
int father[M],rank[M];
int find(int x)
{
    if(x==father[x])
    return x;
    int tmp=father[x];
    father[x]=find(tmp);
    rank[x]=(rank[x]+rank[tmp])%2;
    return father[x];
}
void liantong(int x,int y)
{
    int tmp=find(x);
    int tmp1=find(y);
    if(tmp!=tmp1)
    {
        father[tmp1]=tmp;
        rank[tmp1]=(2-1+2-rank[y]+rank[x])%2;
    }

}
int main()
{
    int text;
    scanf("%d",&text);
    while(text--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0;i<=n;i++)
        {
            father[i]=i;
            rank[i]=0;
        }
        while(m--)
        {
            char ch[10];
            int tmp,tmp1;
            scanf("%s%d%d",ch,&tmp,&tmp1);
            if(ch[0]=='D')
            liantong(tmp,tmp1);
            else
            {
                int x=find(tmp);
                int y=find(tmp1);
                if(x==y)
                {
                    int r=(2-rank[tmp]+rank[tmp1])%2;
                    if(r==0)
                    printf("In the same gang.\n");
                    else
                    printf("In different gangs.\n");
                }
                else
                printf("Not sure yet.\n");
            }
        }
    }
    return 0;
}

 

posted @ 2013-11-22 21:45  紫忆  阅读(2136)  评论(1)    收藏  举报