1703:Find them, Catch them

keyword

union-find C++

概要

2492:A Bug's Lifeと似た問題。
2つのチームがあり、aとbは所属が異なる、という情報とaとbの所属が同じかどうかというクエリが与えられる問題。
前と同じでUnion-Find使って実装。

int par[100005];

int getRoot(int x){
    if(abs(par[x]) == x) return x;
    return par[x] = getRoot(abs(par[x]))*(par[x]>0?1:-1);
}

bool isSame(int x, int y){
    return abs(getRoot(x)) == abs(getRoot(y));
}

void merge(int x,int y){
    if(isSame(x,y)) return ;
    int xx = getRoot(x), yy = getRoot(y);

    par[abs(xx)] = (xx>0)?(-yy):yy;

    return ;
}

int main(){
    int rept, n, m, i, x, y;
    char c;
    scanf("%d\n", &rept);

    while(rept--){
        scanf("%d%d\n",&n,&m);
        REP(i,n+1) par[i] = i;
        REP(i,m){
            scanf("%c %d %d\n",&c,&x,&y);
            if(c=='D'){
                merge(x,y);
            }
            else{
                if(!isSame(x,y)) printf("Not sure yet.\n");
                else if(getRoot(x)==getRoot(y)) printf("In the same gang.\n");
                else if(getRoot(x)==-getRoot(y)) printf("In different gangs.\n");
                //else printf("Not sure yet.\n");
            }
        }
    }

    return 0;
}