1. 程式人生 > 實用技巧 >POJ 1703 Find them, Catch Them 並查集

POJ 1703 Find them, Catch Them 並查集

//並查集
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int MAXN = 1e5+5;

int fa[MAXN*2]; 
int T, N, M, a, b;
char c;

int find(int x){
    if(x != fa[x]) fa[x] = find(fa[x]);
    return fa[x];
}

void unite(int x, int y){
    int fx = find(x);
    int fy = find(y);
    fa[fx] = fy;
}

bool same(int x, int y){
    return find(x) == find(y);
}

int main(){
    scanf("%d", &T);
    while(T--){
        scanf("%d %d", &N, &M);
        memset(fa, -1, sizeof fa); // -1 表示未確定
        while(M--){
            scanf(" %c", &c);
            scanf(" %d %d", &a, &b);
            if(c == 'D'){ 
                if(fa[a] == -1) fa[a] = a, fa[a+N] = a+N;
                if(fa[b] == -1) fa[b] = b, fa[b+N] = b+N;
                //a 和 b+N , a+N 和 b 在一組表示不同 
                unite(a, b+N);
                unite(a+N, b);
            }
            else if(c == 'A'){
                if(fa[a] == -1 || fa[b] == -1) printf("Not sure yet.\n");
                else if(same(a, b)) printf("In the same gang.\n");
                else if(same(a, b+N)) printf("In different gangs.\n"); 
                else printf("Not sure yet.\n");  //AB不同, CD不同,不能確定A和C的關係
            }
        }
    }
    system("pause");
    return 0;
}