范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

数据结构并查集

  简介
  并查集是一种树形的数据结构,主要处理不交集的查询和合并问题,它有两种操作方式: 查找(Find):确定当前结点属于哪一个集合 合并(Union):将两个不同的集合合并在一起
  我们通常使用一个数组  fa[ x ] ,下标 x 代表某一个结点,fa[ x ] 表示这个结点的父结点。 原理初始化
  起始状态,每一个结点都是自成一个集合 for (int i = 0; i < n; i++) {     fa[i] = i; } 查找
  我们希望在这一步可以快速地找到当前结点的根结点 int find(int x) {     return x != fa[x] ? fa[x] = find(fa[x]) : x; }
  这里用到了 路径压缩 的方法。在寻找根结点的过程中,将所有的子节点连接到根结点。
  合并
  由于某些约束,两个原本不相交的集合发生了联系,这个时候,需要将其中的一个集合合并到另一个集合中。
  void Union(int x, int y) {     fa[find(x)] = find(y); }
  这里我们处理地比较简单,将其中一个集合的根结点当作另一个集合的根结点的孩子。如果我们考虑将深度小的树合并到深度较大的树下,查询效率会提高。这种方法我们称之为 按秩合并 。 void unify(int x, int y) {     int fx = find(x), fy = find(y);     if (dep[fx] < dep[fy]) {         fa[fx] = fy;         dep[fy] = max(dep[fy], dep[fx] + 1);     }     else {         fa[fy] = fx;         dep[fx] = max(dep[fx], dep[fy] + 1);     } }
  当然,除了按照深度合并,我们也可以按照树的结点数目合并。因为树的结点数目和深度不总会出现的同一侧(即一个集合的结点数目多且深度大),我们通常选择其中一个作为合并的依据。 题目朋友圈问题
  给定一个  的矩阵 friends,friends[ i ][ j ] = 1 表示 i 和 j 为朋友,反之,表示非朋友,根据这个矩阵找出当前这 n 个人中有几个朋友圈。例如,A 与 B 是朋友,B 与 C 是朋友,那么A、B、C 是一个朋友圈的,即便是A 与 C 不是朋友。
  「分析」
  这是典型的并查集问题,我们需要将每一个人初始化为一个朋友圈,如果两人是朋友就将这两人所在的集合合并,最终只需要统计 fa[ i ] == i 的个数即可。 vector fa, dep;  int find(int x) {     if (x != fa[x]) {         fa[x] = find(fa[x]);         dep[x] = 1;     }     dep[fa[x]] = 2;     return fa[x]; }  void unify(int x, int y) {     int fx = find(x), fy = find(y);     if (dep[fx] < dep[fy]) {         fa[fx] = fy;         dep[fy] = max(dep[fy], dep[fx] + 1);     }     else {         fa[fy] = fx;         dep[fx] = max(dep[fx], dep[fy] + 1);     } }  int findCircleNum(vector>& isConnected) {     int n = (int)isConnected.size();     if (n < 2) { return n; }     fa.resize(n, 0);     dep.resize(n, 1);     for (int i = 0; i < n; i++) {         fa[i] = i;     }     for (int i = 0; i < n; i++) {         for (int j = i + 1; j < n; j++) {             if (isConnected[i][j]) {                 unify(i, j);             }         }     }     int ans = 0;     for (int i = 0; i < n; i++) {         ans += (i == fa[i]);     }     return ans; }
  时间复杂度  ,空间复杂度
  按照公因数分群
  给定一个数组 nums = [20, 50, 9, 63],如果两个数有大于 1 的公因数,这两个数属于同一个群,群成员数目最多是多少?给出的例子是 2。
  「分析」
  【因子分解 + 并查集】。将每一个数与其质因子划分到同一个群,nums 中的数可以通过共同的质因子连接。 vector fa;  int find(int x) {     return x != fa[x] ? fa[x] = find(fa[x]) : x; }  void unify(int x, int y) {     fa[find(y)] = find(x); }  int largestComponentSize(vector& nums) {     int n = *max_element(nums.begin(), nums.end());     fa.resize(n + 1);     for (int i = 0; i <= n; i++) {         fa[i] = i;     }     for (int num : nums) {         for (int prime = 2; prime <= (int)sqrt(num); prime++) {             if (num % prime == 0) {                 unify(num, prime);                 unify(num, num / prime);             }         }     }     vector cnt(n + 1, 0);     for (int num : nums) {         cnt[find(num)]++;     }     return *max_element(cnt.begin(), cnt.end()); }
  时间复杂度: ,空间复杂度:   ,其中 n 是 nums 列表中的最大值。 按公因子排序数组
  给定一个数组 nums = [7, 21, 3],如果两个元素的共因子大于 1,那么我们可以将其交换,试问,能否最终得到一个排序数组?
  「分析」
  【并查集】如果 a 和 b 可交换,b 和 c 可交换,那么 a 和 c 可交换。因此,同一个集合的元素任意交换,即可得到一个排序数组。我们借助一个数与它的所有因子,构造并查集,这样避免  的时间复杂度。最终,我们用排序好的数组与为排序的数组逐一比较,如果两个数字不属于同一个集合,那么 nums 是不能有序的。 vector fa;  int find(int x) {     return x != fa[x] ? fa[x] = find(fa[x]) : x; }  void unify(int x, int y) {     fa[find(y)] = find(x); }  bool gcdSort(vector& nums) {     int n = *max_element(nums.begin(), nums.end()) + 1;     fa.resize(n);     for (int i = 0; i < n; i++) {         fa[i] = i;     }     for (int num : nums) {         for (int prime = 2; prime <= (int)sqrt(num); prime++) {             if (num % prime == 0) {                 unify(num, prime);                 unify(num, num / prime);             }         }     }     vector sortedNums = nums;     sort(sortedNums.begin(), sortedNums.end());     for (int i = 0; i < (int)nums.size(); i++) {         if (nums[i] == sortedNums[i]) { continue; }         if (find(nums[i]) != find(sortedNums[i])) {             return false;         }     }     return true; }
  时间复杂度:  ,空间复杂度:  ,其中 m 是 nums 中的最大值 情侣牵手
  给定一个列表 row = [5, 4, 2, 6, 3, 1, 0, 7],表示 N 对情侣,(2 * i, 2 * i + 1) 是情侣,有些情侣没有相邻坐在一起,我们可以任意调换两个人的座位,来使得情侣坐到一起。试问,最少调换多少次座位?
  「分析」
  【并查集】2i 和 2i + 1,是一对情侣,属于一个集合。如果有人坐错了位置,如三对情侣 a1 b1 c2 b2 a2 c1,我们需调整两次才能回归正常。我们统计所有的坐错位置的情侣集合,然后情侣数减去连通分量数目即为答案。 vector fa;  int find(int x) {     return x == fa[x] ? x : fa[x] = find(fa[x]); }  void unify(int x, int y) {     fa[find(y)] = find(x); }  int minSwapsCouples(vector& row) {     int n = (int)row.size() / 2, cnt = 0;     fa.resize(n);     for (int i = 0; i < n; i++) {         fa[i] = i;     }     for (int i = 0; i < n; i++) {         unify(row[2 * i] / 2, row[2 * i + 1] / 2);     }     for (int i = 0; i < n; i++) {         cnt += (i == find(i));     }     return n - cnt; }
  时间复杂度:   ,空间复杂度:

诛仙世界首测整体回顾美术效果爆表,副本设计重燃开荒热情在换皮坑钱游戏频出,精良大作青黄不接的国产MMORPG市场的大背景下,全新端游诛仙世界的出现,无疑让众多MMORPG爱好者们眼前一亮,游戏自亮相以来便受到了海量的关注。近日诛仙世界打卡秋天的淄博,唯美景美食不可辜负,你是否醉在其中?这家景区还有一票三人行林徽因说爱上一座城,也许是为城里的一道生动风景,为一段青梅往事,为一座熟悉老宅。或许,仅仅为的只是这座城。倘若你问我你为何爱上淄博?其实,语言不足以表达,唯有这些电影级的大片美景可1993年英国10岁少年诱拐2岁孩童并玩弄致死,残忍程度远超成年人Hello,我是观观,咱们又见面啦作家郑执在生吞中说孩童的恶是纯粹的恶,成人的善是复杂的善。人类的善恶是交织共存的,这和年龄没关系。圆滑世故的成年人也有日行一善的时候,未经世事的孩私藏级秋色揭秘!超隐秘的14个小众赏秋地,95的人都不知道没有哪个季节能像秋天一样令人迷醉摄影瑾瑜每年到910月份由北至南依次展开的金黄画卷真是让人目不暇接引得各大媒体号争相报道,游人如织小众又清净的绝美秋色地近些年算是越来越少了恰好再过当代散文回味西藏文张谊和一hr到过了西藏,对西藏有了特殊的感情,回来后特别关注新闻微信中的有关西藏的消息。我们路上看到的拉林铁路的建设新进展了,米拉山隧道马上完工了,林芝桃花又盛开了,西藏要进行第找到卜护士1hr寻寻觅觅,总算找到卜护士。这天,卜伟珍给我发来一张照片你找的是不是这个人?这还说什么,这照片将我记忆中被岁月打磨得有些抽象的形象,立即变得清晰细致起来这脸面,这眉目,这神态,大洋游轮公布2024至2025年环游世界之旅及盛大之旅的精彩航程大洋游轮(OceaniaCruises)素以滋味餐飨和独特航线享誉全球,现正式公布丰富全面的2025年环游世界之旅及盛大之旅系列。大洋游轮于2025年再度推出每年都深受欢迎的180北京疏解加快保定发展提速920日,国家发改委召开新闻发布会,介绍京津冀协同发展相关情况。会议透露重大信息,从今年起,北京将加快非首都功能疏解,高校医院央企总部分期分批向雄安新区搬迁。多家医院高校央企总部等强制锻炼,没有医保,不让穿内衣?聊聊NBA啦啦队的二三事(下)头条创作挑战赛哟观众老爷们欢迎回来观看啦啦队二三事之下篇,如果第一次来的朋友可以去我的文章里看看同样精彩的上篇。那就废话不多说,走着那些奇奇怪怪甚至有些疯狂的规定啦啦队员严禁穿内衣明年,居民医保筹资和待遇标准这样调整近日,天津市出台关于做好2022年城乡居民基本医疗保障工作的通知,调整2023年居民医保筹资和待遇标准,进一步巩固完善我市城乡居民基本医疗保障制度,促进医疗保障高质量可持续发展,增讲病(二)心病心是个主要机关,生疮人心里生气,气变为火,疮越发严重。有病人生气,气变成晦气,病越发重。火气太盛恨气存心来的。恨人伤心,表现有心忙心慌心热夜晚失眠咳嗽吐血冠心病心脏偷停心肌炎心肌梗
一开播就收视第一,央视这部大剧,改写了2022年国产剧的天花板谁能想到,距离2022年结束还有不到一周的时间,年度剧王头衔的竞争,却进入了白热化。与去年当之无愧的剧王觉醒年代不同,今年是越临近年底,王炸剧越多。且不说开年有一部年代大剧人世间打想当女兵?机会来了!全国征兵(女兵)2023年上半年应征报名工作从2023年1月1日开始想成为英姿飒爽的女兵?快来报名吧应征报名对象和应征报名时间上半年应征报名对象普通高等学校和科研机构全日制应届毕业俄乌战争中俄罗斯普京大获全胜!俄罗斯普京在这场俄乌战争中已经大获全胜。拜登在与泽连斯基的联合新闻发布会上称普京想摧毁北约,摧毁西方,摧毁联盟,可惜他错了,错了,俄罗斯不会赢得这场战争。不过目前来看,俄罗斯在这场赵本山的赵家班,一切都该结束了文文亦范编辑小丁有人曾说一个人的文化水平,也称为整体素质,决定了你能成为一位艺术家,还是只能是一个艺人艺术家少之又少,可以影响一个时代,艺人如过江之鲫,跃水即逝。娱乐圈的人总是来来技术控靶向蛋白降解药物研发技术盘点!注本文不构成任何投资意见和建议,以官方公司公告为准本文仅作医疗健康相关药物介绍,非治疗方案推荐(若涉及),不代表平台立场。任何文章转载需得到授权。靶向蛋白质降解蛋白表达和功能异常调原创最短的白天牵动我最长久的思念又一个冬至如约来到人间,我情不自禁地想起母亲。小时候家在大山里的农村,太阳本就比平原地区迟升早落,一进入冬天,更是一天比一天黑得更早,越是临近冬至,昼短夜长的情况就越发明显,终日劳绿色又高效!科研人员研制出制备琥珀酸新技术近日,中国农业科学院麻类研究所农产品生物炼制与转化创新团队通过对高温液态水预处理高浓底物酶解糖化和分批补料发酵等工艺进行耦合和优化,构建了利用木质纤维素原料的琥珀酸绿色高效制备技术设计一款中央计算的软件定义汽车架构软件定义汽车离不开未来的中央计算架构,二者是相辅相成的。上图是德州仪器构思的中央计算架构,笔者设计了一个车辆中央计算架构,对于车辆计算中心选择两片英伟达的Orin,一片侧重于ADASNK中国周志峰游戏是没有边界的精神国度,不能忽视它的正向作用钛媒体TEDGE2012年到2022年的十年时间,是中国游戏产业发展最为迅猛的十年。在12月23日举办的钛媒体2022TEDGE全球创新大会上,SNK株式会社中国总裁前墨麟集团总裁周志峰在回顾了中为了农业强农村美农民富以习近平同志为核心的党中央引领推进新时代农业农村现代化事业述评新华社北京12月22日电题为了农业强农村美农民富以习近平同志为核心的党中央引领推进新时代农业农村现代化事业述评新华社记者从世界百年未有之大变局看,稳住农业基本盘守好三农基础是应变局微生物矿物相互作用不仅在地球演化过程中扮演了重要角色在现代农业应用环境修复生物材料等多方面也起到了关键作用通过改造溶解作用,微生物可从矿物中提取贵金属稀土等元素,形成绿色环保高效的技术,也可以通过促进微生物淋滤矿物中KP等效率,来制