并查集

并查集,主要用于一系列不相交的集合,主要有以下几个API:

  1. void MakeSet(int x):新建一个集合,该集合只有该元素自己
  2. int Find(int x):返回该元素所在的集合的根节点
  3. void Union(int x,int y):合并两个元素所在的集合

给出并查集数据成员:

  1. vector father; 每个元素所在集合的根节点
  2. unordered_map f; 离散化数据,使得father尽可能小
  3. int size; 并查集的元素总数

具体实现

void MakeSet(int x)

void MakeSet(int x){if(!f.count(x)){f[x] = size++;//离散化,使得father[f[x]] = xfather.push_back(x);}else {cout << "已存在";}
}

int Find(int x)

int Find(int x){int fx = x;if(!(x==father[f[x]])){fx = Find(father[f[x]]);father[f[x]] = fx; //路径压缩,使得下次查询复杂度O(1)}return fx;
}

void Union(int x,int y)

void Union(int x,int y)
{int fx = Find(x);//找到x所在的根节点int fy = Find(y);//找到y所在的根节点if(fx!=fy)//如果不在同一个集合{father[f[fx]] = fy;//合并}
}

为了防止树往一边走,除了在Find时路径压缩以外,也可以使用按秩合并,也就是给每一个顶点一个值R称为秩,在合并时总是让R大的树做根节点,若R一样,则任意一个做根节点,R值加一。

void Union(int x,int y)

void Union(int x,int y)
{int fx = Find(x);//找到x所在的根节点int fy = Find(y);//找到y所在的根节点if(fx!=fy)//如果不在同一个集合{if(R[f[fx]]==R[f[fy]])//如果两者秩相同{father[f[fx]] = fy;R[f[fy]]++;//秩加一}else if(R[f[fx]]<R[f[fy]])//否则小者做大者的子树father[f[fx]] = fy;else father[f[fy]] = fx;}
}

例题:

班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。
给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。

class Solution {public:int findCircleNum(vector<vector<int>>& M) {vector<int>UFS(M.size(),0);for(int i = 0;i<M.size();i++){UFS[i] = i;}for(int i=0;i<M.size();i++)for(int j =0;j<i;j++){if(M[i][j]==1)Union(UFS,i,j);}int circle = 0;for(int i=0;i<UFS.size();i++){if(UFS[i] == i) circle++;}return circle;}int  Find(vector<int>&a,int x){int fx = a[x];if(x!=fx){fx = Find(a,a[x]);}return fx;}void Union(vector<int>&a,int x,int y){int fx = Find(a,x);int fy = Find(a,y);if(fx!=fy)a[fx] = fy;}
};

并查集路径压缩_并查集简单教学相关推荐

  1. 并查集路径压缩_并查集(UnionFind)技巧总结

    什么是并查集 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(Union-find Algorithm)定义了两个用 ...

  2. 并查集路径压缩_第二十五天:并查集

    今天是释然发题解的第二十五天,以后会经常和大家分享学习路上的心得,希望和大家一起进步,一起享受coding的乐趣 本文约1400字,预计阅读5分钟 昨天我们学习了动态规划之线性规划,忘记的小伙伴们可以 ...

  3. Rochambeau POJ - 2912 (枚举和加权并查集+路径压缩)找唯一裁判

    题意:有n个人玩石头剪刀布,有且只有一个裁判.除了裁判每个人的出拳形式都是一样的. a<b表示b打败a,a=b表示a和b出拳一样,平手.a>b表示a打败b. 给出m个回合的游戏结果,问能否 ...

  4. 路径压缩优化并查集的时间复杂度

    路径压缩优化并查集大家一定很熟练了,那么它的复杂度是多少呢?O(mα(n))O(m\alpha(n))O(mα(n))? 的确,很多人都是这么说的,但是事实上它的复杂度是O(mlog⁡1+m/nn)O ...

  5. 并查集 路径压缩(具体解释)

    拿HDU 1232举例. 题解: 首先在地图上给你若干个城镇,这些城镇都能够看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比方任意给你两个点.让你推断它们是否连 ...

  6. Never Wait for Weights(带权并查集+路径压缩)

    题目链接:http://acm.sdibt.edu.cn/vjudge/contest/view.action?cid=2209#problem/F !a b w 表示b比a大w ?  a b  输出 ...

  7. 并查集路径压缩和按rank合并代码实现

    1.子集结构体:parent为每个子集的根,rank为秩 struct Subset {int parent;int rank; }; 2.初始化: 一开始每个顶点自成一个子集,它们的parent指向 ...

  8. es集群搭建_滴滴Elasticsearch 集群跨版本升级与平台重构之路

    前不久,滴滴ES团队将维护的30多个ES集群,3500多个ES节点,8PB的数据,从2.3.3跨大版本无缝升级到6.6.1.在对用户查询写入基本零影响和改动的前提下,解决了ES跨大版本协议不兼容.文件 ...

  9. java集群技术_什么是集群?集群?java集群技术面试的一些知识准备

    你是否正在寻找关于集群技术的内容?让我把最完整的东西奉献给你: java集群技术面试的一些知识准备 一个集群系统是一群松散结合的服务器组,形成一个虚拟的服务器,为客户端用户提供统一的服务.对于这个客户 ...

  10. SDU_week6_B - 戴好口罩!(路径压缩的并查集)

    题目描述 新型冠状病毒肺炎(Corona Virus Disease 2019,COVID-19),简称"新冠肺炎",是指2019新型冠状病毒感染导致的肺炎. 如果一个感染者走入一 ...

最新文章

  1. 阿里云天池大赛赛题解析――深度学习篇
  2. js date 当前日志往后一个月_【应用实例】如何利用 Python 生成器 yield 监控日志?...
  3. pandas最大的时间间隔_pandas计算最大连续间隔的方法
  4. CSS的继承、权值与层叠
  5. 笑联 x mPaaS | 12 个模块,全面小程序化,如何打造真正的一次开发复用多端?
  6. 第十章:禁丹药,禁符纸
  7. jmeter tps指标在哪里看_jmeter性能测试讲的很详细
  8. 12123两小时没付款怎么办_交管12123支付宝小程序付款不了怎么办 交管12123支付宝缴费方法介绍[多图]...
  9. 服务器 IIS主机的Rewrite伪静态组件下载与配置
  10. 高中数学建模优秀论文_高中数学建模优秀论文
  11. ipython的用法详解
  12. java击鼓传花游戏list_击鼓传花游戏作文集合15篇
  13. 丹麦为啥能成为“养猪王国”与“养猪强国”
  14. 如何将Kali Linux中的Firefox ESR浏览器语言设置为中文
  15. 离散数学——coq学习笔记(二)
  16. python中len 函数_Python函数精解:len()函数
  17. 柱状图怎么设置xy轴_excel表格xy轴数据-怎么做用excel设置xy轴
  18. 人体骨骼关键点检测综述
  19. 网络聊天中的英语简写
  20. MATLAB在安装时需要选择安装的产品

热门文章

  1. 防火防盗竟防不了网络攻击 智能摄像机的网络安全怎么办?
  2. postman 使用
  3. Redis开发运维实践上线部署规划之内存规划
  4. 前端开发负责人修炼指北
  5. H3C CLI基础笔记(交换机,链路聚合-DHCP)
  6. vertical-align属性
  7. 运维自动化部署Cobbler之服务安装篇
  8. 问题处理:VMware Workstation和Device / Credential Guard不兼容
  9. linux中的输出格式化,Linux column使用(格式化输出)
  10. WiFi 扫描结果的通知过程