数据结构——并查集

1.并查集的定义

并查集其实也是一种树形结构,在使用中通常用森林的方式来表示

并查集的逻辑结构其实就是集合

并查集一般可以通过双亲写法(顺序结构)来完成,即通过一个数组存储父亲结点的下标

int s[10005];
int main()
{for(int i=1; i<=n; i++){s[i]=-1;
//为什么一开始都归属于-1呢,我们要从定义入手,我们的数组存储的是父亲结点的下标,若从-1开始,
//可以意味着,他们一开始都是单独的元素,方便后续的查和并操作}
}

2.并查集能进行的操作

1.查:寻找一个元素归属于哪个集合或者说判断两个元素是否同属于一            个集合

int cha(int x)
{while(s[x]>=0)//当指针不为-1时就会一直向前搜索,直到搜索出根结点x=s[x];return x;//返回根结点的下标
}

2.并:将两个子树并在一起,通常是将小子树并在大子树上面

void bing(int root1,int root2)
{if(root1==root2) return;//传进来两个根节点一样的本来就是本身,不用合并,直接返回就好s[root2]=root1;//将子树2的指针指向子树1的下标
}

3.并查集相关例题

第一题:并查集

 题解,这题也是十分简单,合并操作就是用上述的并,判断是否在一个集合就要用查了,如果相等,则证明在一个集合里

看AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;int a[20005];//定义一个双亲写法的数
int z,x,y;
int cha(int x)//查
{while(a[x]>=0){x=a[x];}return x;
}
void bing(int root1,int root2)//并
{if(root1==root2)return;a[root2]=root1;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){a[i]=-1;}for(int i=0;i<m;i++){scanf("%d%d%d",&z,&x,&y);if(z==1){bing(cha(x),cha(y));//合并树的时候合并的是根}if(z==2){int p=cha(x);int q=cha(y);if(p==q)printf("Y\n");elseprintf("N\n");}}return 0;
}

第二题:亲戚

 题解:这题也是很简单,判断是否是亲戚,只需要判断是否在一个结点就可以,因此上面那题差不多

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,p;
int s[10005];
int x,y;
int cha(int x)
{while(s[x]>=0)x=s[x];return x;
}
void bing(int root1,int root2)
{if(root1==root2) return;s[root2]=root1;
}
int main()
{scanf("%d%d%d",&n,&m,&p);for(int i=0; i<m; i++)//    for(int i=1; i<=n; i++){s[i]=-1;}{scanf("%d%d",&x,&y);bing(cha(x),cha(y));}int r,t;for(int i=0; i<p; i++){scanf("%d%d",&r,&t);int te=cha(r);int re=cha(t);if(te==re)printf("Yes\n");elseprintf("No\n");}return 0;
}

第三题:朋友

 题解,我们只需要放置两个数组,判断那边的子树的节点更少就可以

AC代码

#include<bits/stdc++.h>
using namespace std;
int n,m,p,q;
int x,y,z,t;
int a[10005];
int b[10005];int cha(int x,int s[])
{while(s[x]>=0)x=s[x];return x;
}
void bing(int root1,int root2,int z[])//唯一要处理的就是尽量往小明和小红身上连接子树
{if(root1==root2)return ;if(root1==1){z[root2]=root1;}else if(root2==1){z[root1]=root2;}else{z[root2]=root1;}
}
int main()
{scanf("%d%d%d%d",&n,&m,&p,&q);for(int i=1; i<=n; i++){a[i]=-1;}for(int i=1; i<=m; i++){b[i]=-1;}for(int i=0; i<p; i++){scanf("%d%d",&x,&y);bing(cha(x,a),cha(y,a),a);}for(int i=0; i<q; i++){scanf("%d%d",&z,&t);bing(cha(-z,b),cha(-t,b),b);}int sum1=0,sum2=0;for(int i=1; i<=n; i++){if(cha(i,a)==1)sum1++;}for(int i=1; i<=m; i++){if(cha(i,b)==1){sum2++;}}printf("%d\n",min(sum1,sum2));return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/442869.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营29期|day36任务以及具体安排

第八章 贪心算法 part05 435. 无重叠区间 class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals, (a,b)-> {return Integer.compare(a[0],b[0]);});if(intervals.length 1) return 0;int result 0;for(int i 1 ; i < interva…

spring整合mybatis的底层原理

spring整合mybatis的底层原理 原理&#xff1a; FactoryBean的自定义对象jdk动态代理Mapper接口对象 一、手写一个spring集成mybatis 目录结构&#xff1a; 1.1 入口类 public class Test {public static void main(String[] args) {AnnotationConfigApplicationContext co…

大数据开发之离线数仓项目(用户行为采集平台)(可面试使用)

第 1 章&#xff1a;数据仓库概念 数据仓库&#xff0c;是为企业指定决策&#xff0c;提供数据支持的&#xff0c;可以帮助企业&#xff0c;改进业务流程、提高产品质量等。 数据仓库的输入数据通常包括&#xff1a;业务数据、用户行为数据和爬虫数据等。 业务数据&#xff1a…

HiveSQL题——数据炸裂和数据合并

目录 一、数据炸裂 0 问题描述 1 数据准备 2 数据分析 3 小结 二、数据合并 0 问题描述 1 数据准备 2 数据分析 3 小结 一、数据炸裂 0 问题描述 如何将字符串1-5,16,11-13,9" 扩展成 "1,2,3,4,5,16,11,12,13,9" 且顺序不变。 1 数据准备 with da…

【原创】VMware创建子网,并使用软路由获得访问互联网的能力,并通过静态路由让上层网络访问位于虚拟机的子网

前言 一看标题就很离谱&#xff0c;确实内容也有点复杂&#xff0c;我的初衷是为后面搞软路由做准备&#xff0c;先通过VMware进行可行性验证&#xff0c;确定方案是否可行&#xff0c;再做下一步的计划。结论当然可以的&#xff0c;能通能访问&#xff0c;强的不行。 网络拓…

2023强网杯复现

强网先锋 SpeedUp 要求2的27次方的阶乘的逐位之和 在A244060 - OEIS 然后我们将4495662081进行sha256加密 就得到了flag flag{bbdee5c548fddfc76617c562952a3a3b03d423985c095521a8661d248fad3797} MISC easyfuzz 通过尝试输入字符串判断该程序对输入字符的验证规则为9…

回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小支持向量机的数据多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于OOA-LSSVM鱼鹰算法优化最小…

Unix/Linux上的五种IO模型

a.阻塞 blocking 调用者调用了某个函数&#xff0c;等待这个函数返回&#xff0c;期间什么也不做&#xff0c;不停的去检查这个函数有没有返回&#xff0c;必须等这个函数返回才能进行下一步动作。 注意&#xff1a;阻塞并不是函数的行为&#xff0c;而是跟文件描述符有关。通…

HTM标签 - 2

HTM标签 超链接标签 超链接标签&#xff1a;<a> 文本或图片 </a> 用法1&#xff1a;在页面中使用超链接标签跳转到另一个页面 属性描述href页面跳转的地址&#xff0c;相对地址或绝对地址&#xff1b;###&#xff1a;空连接&#xff1b;#&#xff1a;跳转到当前…

树和二叉树基础

树和二叉树基础 1.1树的概念 树是在数据结构中第一次接触到的非线性结构。 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它 叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&am…

LVS常用的NAT模式和DR模式实战示例

引言&#xff1a;紧接上文&#xff0c;了解LVS&#xff0c;这一篇就够了-CSDN博客&#xff0c;今天我们对LVS常用的两种模式来进行示例配置演示 LVS-NAT模式 1、环境准备 准备 3 台纯净的虚拟机 关闭防火墙和selinux 例&#xff1a; lvs-server 添加两个网卡 NAT模式 …

如何在Excel中清除单元格的格式?这里有详细步骤

Microsoft Excel提供了大量样式选项来自定义电子表格的外观。但是&#xff0c;如果你需要删除格式&#xff0c;则可以很容易地删除选定单元格和整个工作表的格式。我们将向你展示如何操作。 ​注意&#xff1a;清除格式只会删除文本的样式&#xff1b;将保留你的实际文本。 如…