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

在这里插入图片描述

食物链 这一题类似, 都是运用并查集来判断是否在不同的集合, 关键在于对关系的判断

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 1e5+5;

int par[maxn*2], rak[maxn*2], N, M;;
void init(int n){
    for(int i = 1; i <= n; i++)
        par[i] = i, rak[i] = 0;
}
int findr(int a){
    if(par[a]==a) return a;
    else return par[a] = findr(par[a]);
}
void unite(int a, int b){
    a = findr(a), b = findr(b);
    if(a==b) return;
    if(rak[a] < rak[b])
        par[a] = b;
    else{
        par[b] = a;
        if(rak[a]==rak[b])
            rak[a]++;
    }
}
bool isSame(int a, int b){return findr(a)==findr(b);}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&N,&M);
        init(N*2);
        char opt; int a, b;
        for(int i = 1; i <= M; i++){
            scanf("\n%c%d%d",&opt,&a,&b);
            if(opt=='D'){
                unite(a, b+N), unite(a+N, b);
            }
            else{
                if(isSame(a,b+N) || isSame(a+N,b))
                    printf("In different gangs.\n");
                else if(isSame(a, b) || isSame(a+N, b+N))
                    printf("In the same gang.\n");
                else
                    printf("Not sure yet.\n");
            }
        }
    }
	return 0;//
}

猜你喜欢

转载自blog.csdn.net/a1097304791/article/details/87210635