并查集

本文深入解析并查集算法在构建最小生成树中的应用,通过实例讲解如何判断两点间连通性,以及如何通过并查集维护亲戚关系网,实现高效集合操作。

这个有时候做关于图的时候会用的到,比如要建成一颗最小生成树,这个并查集就能够用上了,它的作用就大了,可以判断两个点之间是否连通,当两个点之间联通了就说明他们是以集合里面的,也可以用亲戚关系来表达,三个原本互相不认识的人聚到了一起,他们分别是A,B,C;随着三人之间的更加熟悉,A和B是亲戚关系(即A和B之间是连通的),B和C之间也是亲戚关系,所以A和C之间也是亲戚,所以A、B、C都是亲戚关系,即他们都是连通的,这个时候我们怎么知道他们三个是亲戚关系?只需要从他们之中找出一个代表,就相当于氏族族长,你凭什么说你们就是一个家族的,我们的族长是一样的,这样就能够知道了。为了方便,我们把每次最后一个进入家族的当做族长,代码如下。

#include<iostream>
using namespace std;
const int H=1e5+3;
int fa[H];
void build(int N)//初始化,N个人都是互相不认识的
{
    for(int i=1;i<=N;i++){
        fa[i]=i;
    }
    return ;
}
int find(int x)//找到x的族长是谁
{
    return fa[x]==x?x:fa[x]=find(fa[x]);
}
bool che(int x,int y)//判断x,y是不是一个族的
{
    return find(x)==find(y);
}
void mer(int x,int y)//如果x,y不是一个族的,就把他们并入到一个家族中
{
    if(!che(x,y)){
        fa[fa[x]]=fa[y];
    }
    return ;
}
int main()
{
    int N,M;
    cin >> N >> M;//N代表有几个人,M代表他们之间有几种关系(一对一的)
    build(N);
    for(int i=0;i<M;i++){
        int x;
        int y;
        cin >>x >> y;
        mer(x,y);
    }
    int p;//输入p组x和y的关系,如果是一个家族的就输出Yes,否则输出No
    cin >> p;
    for(int i=0;i<p;i++){
        int x;
        int y;
        cin  >> x >> y;
        if(che(x,y)){
            cout << "Yes" << endl;
        }
        else{
            cout << "No" << endl;
        }
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/sddr/p/10719560.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值