【算法】并查集题解 ​P1551 亲戚​


P1551 亲戚

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 1e5 + 10;
int fa[maxn];//fa[x]存储x的父亲
//并查集的方法
int find(int x) {//找到x的祖宗
    if (fa[x] != x) {//先找x的父亲是不是x自己,如果是x便是祖宗
        return fa[x] = find(fa[x]);//如果不是则找x父亲的父亲,并赋值该该fa[x]压缩路径
    }
    return x;
}


int main()
{
    int n, m, p;

    cin >> n>> m>> p;
    for (int i = 0; i <= n; i++) {
        fa[i] = i;//开始时所有人都是自己的祖宗
    }
    for (int i = 0; i < m; i++) {
        int a, b;
        scanf("%d%d", &a, &b);//输入表示a是b的亲戚,即a的祖宗是b的祖宗
        fa[find(a)] = find(b);//使a的祖宗的祖宗是b的祖宗,这样ab便是一个家族的了
    }

    for (int i = 0; i < p; i++) {
        int a, b;
        scanf("%d%d", &a, &b);
        if (find(a) == find(b)) {//如果a,b祖宗一样
            printf("Yes\n");
        }
        else printf("No\n");
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值