Find them, Catch them 并查集poj1703

题目链接Find them, Catch them
题意:
刚开始看起来挺简单,但是我越看越觉得绕。。

  1. D [a] [b]
    其中[a]和[b]是两个犯罪分子的编号,他们属于不同的帮派;
  2. A [a] [b]
    其中[a]和[b]是两个犯罪分子的编号,您要确定a和b是否属于同一帮派。
    但是这里要清楚只有两个成员所属帮派都互为对立时,才能说属于两个不同帮派
    这里因为有对立帮派的原因,我们做一个映射,我们规定a + n 为a 成员所属帮派的对立帮派
    在D操作时,要注意,对于输入的ab 我们要把a和b的对立帮派进行合并的同时也要把b和a的对立帮派合并,因为a,b这里已经知道了互为对立的不同帮派
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 1e5 +5;

int f[2 * maxn];

void init(int n)
{
    for(int i = 1; i <= 2 * n; i++){
        f[i] = i;
    }
}

int Find(int root)
{
    int son = root;
    while(root != f[root]){
        root = f[root];
    }
    //压缩路径
    while(son != root){
        int temp = f[son];
        f[son] = root;
        son = temp;
    }
    return root;
}

void add(int x,int y)
{
    int a = Find(x);
    int b = Find(y);
    if(a != b){
        f[a] = b;
    }
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        cin>>n>>m;
        init(n);
        char s[2];
        int a,b;
        for(int i = 0; i < m; i++){
            scanf("%s%d%d",s,&a,&b);
            if(s[0] == 'A'){
                int u = Find(a);
                int v = Find(b);
                if(Find(a) == Find(b + n)&&Find(b) == Find(a + n)){
                    printf("In different gangs.\n");
                }
                else if(u == v){
                    printf("In the same gang.\n");
                }
                else{
                    printf("Not sure yet.\n");
                }
            }
            if(s[0] == 'D'){
                add(a,b + n);//b +n 表示将a添加到b的对立帮派,下同
                add(b,a + n);
            }
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值