并查集(数据结构)

并查集是一种数据结构,他的作用有两个:

1,合并:将两个子集合并成一个集合

2,查找:确定某个元素处在哪个集合

fa[x]存节点x的父节点

查找:

就是为了找到某个点的根节点,如果找到了就返回,如果没找到就继续递归查找

int find(int x){if(fa[x]==x)return x;return find(fa[x]);
}

这个过程我们优化一下,优化为带路径压缩的查找

在返回的路上,顺带修改各节点的父节点为根,这样的好处就是,我遍历过一次的节点,那么下次再查找时就可以直接找到不用再来一次遍历,

int find(int x){if(fa[x]==x)return x;return fa[x]=find(fa[x]);
}

合并:

将两个集合合并在一起,拥有一个共同的根

void unionm(int x,int y){fa[find(x)]=find(y);
}

就是让x的根节点指向y的根节点

但是我们通常都是让小集合指向大集合,所以其实还可以再优化一下(但其实这步优化没必要,有上面路径压缩的优化足够了)

//按秩合并
vector<int>siz(N,1);//记录并初始化子树的大小为1
void unionm(int x,int y){x=find(x),y=find(y);if(x==y)return;if(siz[x]>siz[y])swap(x,y);fa[x]=y;siz[y]+=siz[x];
}

来道例题练习一下

P3367 【模板】并查集

#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int fa[N];
int find(int x){if(fa[x]==x)return x;return fa[x]=find(fa[x]);
}
void unionn(int x,int y){//别写成union关键字fa[find(x)]=find(y);
}
int main(){int n,m;cin>>n>>m;for(int i=1;i<=n;i++){fa[i]=i;}while(m--){int z,x,y;cin>>z>>x>>y;if(z==1){unionn(x,y);}else{x=find(x),y=find(y);if(x==y)cout<<"Y"<<endl;else{cout<<"N"<<endl;}}}return 0;
}

 

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

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

相关文章

LZO索引文件失效说明

在hive中创建lzo文件和索引时&#xff0c;进行查询时会出现问题.hive的默认输入格式是开启小文件合并的&#xff0c;会把索引也合并进来。所以要关闭hive小文件合并功能&#xff01;

每日一练 | 华为认证真题练习Day192

1、下面是路由器RTB的部分输出信息&#xff0c;关于输出信息描迷错误的是: A. 接口上动态加入的组播组个数是1。 B. 加入的组播组地址是225.1.1.2 C. DISPLAY IGMP GROUP命令用来查看IGMP组播组信息&#xff0c;包括通过成员报告动态加入的组播组和通过命令行静态加入的组播组…

Python里的全局变量、局部变量、类的self.*

问题 困惑&#xff0c;leetcode第538题&#xff0c;写成下面这种&#xff0c;不能得到正确的答案&#xff1a; class Solution_a:def traverse(self, root, cur_sum):# 思路&#xff1a;中序遍历可以打印出有序的数组&#xff0c;那么反一下&#xff0c;先右后中再左就可以打…

YOLOv8独家原创改进:特征融合涨点篇 | 广义高效层聚合网络(GELAN) | YOLOv9

💡💡💡本文独家改进:即结合用梯度路径规划(CSPNet)和(ELAN)设计了一种广义的高效层聚合网络(GELAN),高效结合YOLOv8,实现涨点。 将GELAN添加在backbone和head处,提供多个yaml改进方法 💡💡💡在多个私有数据集和公开数据集VisDrone2019、PASCAL VOC实现…

类变量【静态变量 static】

类变量【静态变量 static】 什么是类变量如何定义类变量如何访问类变量类变量使用注意事项和细节 什么是类变量 类变量&#xff0c;也叫静态属性/静态变量&#xff0c;是该类的所有对象共享的变量&#xff1b;   1&#xff09;任何一个该类的对象去访问它时&#xff0c;取到的…

DAY 11有效括号 删除字符串中的相邻重复项 逆波兰表达式

3.有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的…

eclipse搭建java web项目

准备条件 eclipsejdk1.8 &#xff08;配置jdk环境&#xff09;apache-tomcat-8.5.97&#xff08;记住安装位置&#xff09; 一 点击完成 开始创建javaweb项目 import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.s…

CAD图纸归档平台、CAD图纸归档系统

CAD图纸归档平台是用于管理和存储CAD图纸的在线平台。这些平台提供了多种功能&#xff0c;包括图纸上传、下载、版本控制、共享、协作和搜索等。它们可以大大提高CAD图纸的管理效率和协作效率&#xff0c;减少纸质图纸的使用和存储成本&#xff0c;同时也方便用户随时随地访问和…

关于python函数参数传递

参数传递 在 python 中&#xff0c;类型属于对象&#xff0c;对象有不同类型的区分&#xff0c;变量是没有类型的&#xff1a; 在下面的代码示例重&#xff0c;[1,2,3] 是 List 类型&#xff0c;“qayrup” 是 String 类型&#xff0c;而变量 a 是没有类型&#xff0c;它仅仅…

奥维云网:森歌智能水洗集成灶开启集成灶4.0时代

新的一个商业“竞争年”正式到来。厨电集成灶行业率先发力。2曰27日&#xff0c;森歌以“勠力同心&#xff0c;共生共歌”为主题召开了盛大的全国优秀经销商峰会&#xff0c;并在峰会上一连发布了三个重磅消息&#xff0c;被视为集成灶行业的破冰行动&#xff01; 从国家统计局…

MySQL 学习记录 2

原文&#xff1a;https://blog.iyatt.com/?p13818 13 存储引擎 查看一下前面创建的一张表的创建语句&#xff0c;当时并没有显式指定引擎&#xff0c;MySQL 自动指定的 InnoDB&#xff0c;即默认引擎是这个。 创建表的时候要显式指定引擎可以参考这个语句 查看当前 MySQL …

深度学习GPU环境安装(WINDOWS安装NVIDIA)

1.检测是否支持GPU环境 1.1.打开设备管理器 winows下面搜索设备管理器&#xff08;或者从桌面"此电脑"——>右键点击——>"管理"打开&#xff09; 1.2.查看本地显卡 在"设备管理器"——"显示适配器"中&#xff0c;如果没有&…