poj1703 Find them, Catch them

题意:在一个城市里有两个黑手党,有两个操作询问你他们的关系,和表明那连个人不是一个黑手党的(重点是表明他们不是一个集合),你判断有三种,不知道,是,不是。
思路:由于操作是表明不是一个团伙,这里的关系和poj1182很像,比普通是否在一个集合又多了一层关系,所以就用并查集分组的思想。

#include<cstdio>
#include<cstring>
using namespace std;
const int N=100000;
int f[N*2+10];
void init(){for(int i=0;i<=N*2+10;i++) f[i]=i;}
int Find(int x) {return x==f[x]? x: f[x]=Find(f[x]);}
int Merge(int x,int y){ x=Find(x);y=Find(y); if(x==y) return 0; f[x]=y; return 1;}
int main()
{
    int T;scanf("%d",&T);
    while(T--){
        int n,m;scanf("%d%d",&n,&m);
        init();for(int i=0;i<m;i++){
         char c;int a,b;scanf(" %c %d %d",&c,&a,&b);
          if(c=='A'){
            if(Find(a)==Find(b)&&Find(a+N)==Find(b+N)) printf("In the same gang.\n");
            else if(Find(a)==Find(b+N)&&Find(a+N)==Find(b)) printf("In different gangs.\n");
            else printf("Not sure yet.\n");
          }
          else if(c=='D') Merge(a,b+N),Merge(a+N,b);
        }
    }
}

你可能感兴趣的:(poj1703 Find them, Catch them)