|并查集下标缩小标记vis根|L2-3 家庭房产 (25分)

该博客探讨了一道涉及并查集的算法题目,强调理解并查集的概念及其在连接相关元素中的作用。博主提供了并查集(路径压缩)的模板,并详细解释了如何利用并查集解决家庭房产问题,包括建立结构体数组、确定标识以及处理合并时选择最小编号作为根节点。博客还提到了输入处理和输出排序的注意事项。
摘要由CSDN通过智能技术生成

https://blog.csdn.net/zpjlkjxy/article/details/79689536
要搞清楚一些细节
1.我们要用到并查集

什么是并查集?并查集有什么用?
并查集就是把有关系的点连在一起成线,成树。
在做题时,我们经常把有关系的人用并查集的方法来联系在一起,成组

下面是并查集(压缩路径)的模板

int findFather(int x){
   
    if(x==father[x])return x;
    else{
   
        int F=findFather(father[x]);
        father[x]=F;
        return F;
    }
}
//因为本题目要把一个家庭中的最小编号输出,所以我们以最小编号为根节点
void Union(int a,int b){
   
    int faA=findFather(a);
    int faB=findFather(b);
    if(faA>faB)
        father[faA]=faB;
    else
        father[faB]=faA;
}

void init(){
   
    for(int i=0;i<10010;i++){
   
        father[i]=i;
    }
}

在这里插入图片描述

//不用太纠结他们到底是什么关系,只要有关系,我们就把他们联系在一起,放在一个组
//我们可以根据需要来改变根节点
//在本题中,我们以第一个编号(我)来连接父亲编号、母亲编号、孩子编号,放在一个组
//所以,在一个组里面都是和我有关系的,可以用来算家庭人员总数
int main()
{
   
    int n;
    cin>>n;
	int visit[10010]={
   0};
    for(int i=0;i<n;i++){
   
        int id,fid,mid;
        cin>>id>>fid>>mid;//6666 5551 5552

        visit[id]++;
        if(fid!=-1){
   
            visit[fid]++;
            Union(fid,id);
        }
        if(mid!=-1){
   
            visit[mid]++;
            Union(mid,id);
        }
        int k;
        cin>>k;
        for(int t=0;t<k;t++){
   
            int cid;
            cin>>cid;
            if(cid!=-1){
   
            visit[cid]++;
            Union(cid,id
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值