poj 1703 -- Find them, Catch them(并查集)

题目大意:有两个帮派,给出你互相敌对的两个人,询问敌对关系

由于只有两个帮派,分别用n和n+max表示逻辑正反两反面,两个同一集合内的两个都小于max代表相同帮派,一个小于一个大于代表不同帮派

#include<iostream>
#include<cstdio>
using std::cin;
using std::cout;
using std::endl;
const int max=100100;
int pre[2*max];
int cnt;
int find (int x)
{
    if(pre[x]!=x)
        pre[x]=find(pre[x]);
    return pre[x];
}
void Union(int x,int y)
{
    pre[find(x)]=find(y);
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        for(int i=0; i<2*max; pre[i++]=i);
        int n,m;
        char tmp;
        cin>>n>>m;
        while(m--)
        {
            int a,b;
            getchar();
            scanf("%c%d%d",&tmp,&a,&b);
            if(tmp=='D')
            {
                Union(a,b+max);
                Union(b,a+max);
            }
            else
            {
                if(find(a)==find(b))
                    cout<<"In the same gang."<<endl;
                else if(find(a)==find(b+max)||find(a+max)==find(b))
                    cout<<"In different gangs."<<endl;
                else
                    cout<<"Not sure yet."<<endl;
            }
        }
    }
}


你可能感兴趣的:(poj 1703 -- Find them, Catch them(并查集))