博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构与算法——并查集
阅读量:3920 次
发布时间:2019-05-23

本文共 2005 字,大约阅读时间需要 6 分钟。

Catalog

引言

并查集是用于将n个不同元素分成一组不相交集合的数据结构

实现

带路径压缩和按秩合并的并查集

在实现上,数组中的每一个值的绝对值代表当前集合的元素个数
两个操作的时间复杂度几乎为常数

class ufs{
private: int* father; public: ufs(int size) {
father = new int[size]; for(int i = 0;i < size;i++)//这里的设计很精妙 father[i] = -1; //用正数会带来混乱,数组绝对值为该集合个数 } int find(int w) {
if(father[w] < 0) //找到根 return w; return father[w] = find(father[w]); //路径压缩 //迭代实现 /*while(father[w] >= 0) { father[w] = father[father[w]]; w = father[w]; } return w;*/ } void _union(int w,int v) {
int fw = find(w); int fv = find(v); if(fw == fv)//属于同一个集合 return ; //按秩合并 //这里看绝对值 if(father[fw] > father[fv])//集合fw的个数小于fv {
father[fv] += father[fw];//小的加到大的上面 father[fw] = fv; } else {
father[fw] += father[fv]; father[fv] = fw; } }};

下面给出以展现并查集这个非常精妙的数据结构

这道题,是很典型的并查集,寻找不相交集合的个数。在上面ufs的基础上增加一个变量成员num,用于记录当前不相交集合的个数。每合并一次少一个。实际上我们只遍历了1/2(n2-n)个元素

class ufs{
private: int* father; public: int num; ufs(int size) {
num = size; father = new int[size]; for(int i = 0;i < size;i++) father[i] = -1; //用正数会带来混乱,数组绝对值为该集合个数 } int find(int w) {
if(father[w] < 0) //找到根 return w; return father[w] = find(father[w]); //路径压缩 } void _union(int w,int v) {
int fw = find(w); int fv = find(v); if(fw == fv)//属于同一个集合 return ; //按秩合并 //这里看绝对值 if(father[fw] > father[fv])//集合fw的个数小于fv {
father[fv] += father[fw];//小的加到大的上面 father[fw] = fv; } else {
father[fw] += father[fv]; father[fv] = fw; } num--; return; }};class Solution {
public: int findCircleNum(vector
>& M) {
ufs s(M.size()); for(int i = 0;i < M.size();i++) //这里我们只需要遍历下三角 for(int j = 0;j <= i;j++) if(M[i][j] && i!=j) s._union(i,j); return s.num; }};int main(){
Solution s; vector
> M = {
{
1,0,0,1},{
0,1,1,0},{
0,1,1,1},{
1,0,1,1}}; cout<

转载地址:http://qxhrn.baihongyu.com/

你可能感兴趣的文章
C#基于yolov3的行人检测
查看>>
ML.NET Cookbook:(16)什么是规范化?为什么我需要关心?
查看>>
WPF 修改(优化)Menu菜单的样式
查看>>
晕了!这个配置值从哪来的?
查看>>
我开发了一款基于web容器的前端项目容器
查看>>
WPF实现环(圆)形菜单
查看>>
WPF 写一个提醒工具软件(完整项目)
查看>>
NET问答: 多个 await 和 Task.WaitAll 是等价的吗?
查看>>
MIPS衰落 LoongArch崛起
查看>>
无需羡慕,今后.NET开发想拿30k也可以毫不费劲!
查看>>
面向.NET开发人员的Dapr——俯瞰Dapr
查看>>
WPF 菜单栏滚动到顶部后固定的两种方法
查看>>
Windows 11 快速体验:开始菜单居中,全系圆角设计!
查看>>
异步流使用注意事项
查看>>
NET问答: 为什么仅有 getter 的属性,还可以在构造函数中赋值 ?
查看>>
WPF TextBox限制只能输入数字的两种方法
查看>>
【荐】牛逼的WPF动画库:XamlFlair
查看>>
如何绕过 TPM 2.0 安装 Windows 11 操作系统?
查看>>
为WPF播放GIF伤神不?
查看>>
.NET Core with 微服务 - Elastic APM
查看>>