并查集(c++)-----南昌理工学院ACM集训队

例题为洛谷P3367(并查集(模板))

简介

并查集:在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述;(摘取与百度百科)

并查集主要操作

为了方便理解,把并查集比作两个小混混打架
1.找老大(查):
两个混混打架,大家都知道,打架之前都是搬出自家老大的名字先吓唬吓唬人,先自报老大的名字,
也就是找到两个集合中级别最高的元素,毕竟老大一般不会直接对小弟负责,所以也有可能出现
自己人打自己人的乌龙事件;

int f[10005];//f数组中每一个值为它的下标
int find(int k){if(f[k]==k)return k;return find(f[k]);
}
int th(int x,int y){//看看老大是不是同一个人;int x_root=find(x);int y_root=find(y);if(x_root==y_root){return 1;}else{return 0;}
}

3.将两个集合合并为一个集合(并):
若是老大是一个人(两个元素属于一个集合),就打不起来,若是老大不是同一个人,两边就开打,让一边吞掉另一边所有的人(合并),至于哪边赢哪边输都无所谓。

int un(int x,int y){int x_root=find(x);int y_root=find(y);if(x_root==y_root){return 0;}else{f[x_root]=y_root;//两个集合合并;return 1;}
}

路径压缩

刚刚就说了,两个小弟先搬出自己老大的名号,但是他们不知道,就先去问自己上一级,一直问上去,时间复杂度就比较大,毕竟老大一般不会直接对小弟负责,而负责任的老大,为了以后打架效率更高,会直接对所有的小弟负责;
详见下图:

而代码实现就是将找老大的时间缩减:

int find(int k){if(f[k]==k)return k;return f[k]=find(f[k]);/* 即:f[k]=find(f[k]);return f[k];*/

因为我们要路过他所有的上级,我们也可以顺便使途中经过的人的大哥也变成老大;

例题:

选自luoguP3367(并查集模板)

这里就不罗嗦了,直接上代码了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;int pre[10005];int f(int x){if(pre[x]==x)return x;return pre[x]=f(pre[x]);
}int main()
{int n,m;cin>>n>>m;int x,y,z;for(int i=1;i<n;i++)pre[i]=i;for(int i=0;i<m;i++){scanf("%d%d%d",&x,&y,&z);if(x==1){pre[f(y)]=f(z);}else if(x==2){if(f(y)==f(z)){printf("Y\n");}else{printf("N\n");}}}return 0;
}

奥里给 !冲!冲!冲!

并查集及其优化(南昌理工学院ACM集训队)相关推荐

  1. ACM暑假培训第三周学习总结----出自南昌理工学院ACM集训队

    8月2日 1.unsigned long long输出的时候可以使用 %llu 或者 %I64u 2.long long本质上还是整型,只不过是一种超长的整型 int型:32位整型,取值范围为[-2^ ...

  2. 运用快速幂算法(南昌理工学院ACM集训队)

    快速计算幂 普通求幂运算 快速幂算法的实现 普通求幂运算 什么是快速幂?为什么要运用快速幂?快速幂又如何成为普遍算法的呢? 快速幂其实就是将一个数n的多次幂的求解,我们会这样做. 举个例子,计算2的2 ...

  3. 【牛客 - 368D】动态连通块(并查集+bitset优化)

    题干: 小T有n个点,每个点可能是黑色的,可能是白色的. 小T对这张图的定义了白连通块和黑连通块: 白连通块:图中一个点集V,若满足所有点都是白点,并且V中任意两点都可以只经过V中的点互相到达,则称V ...

  4. AcWing4084 号码牌 (并查集 / bitset优化Floyd)

    题目链接: 号码牌 大致题意 给定一个长度为nnn的序列, 第iii个位置的值为aia_iai​. (保证aaa是111~nnn的一个排列) 每个位置还有一个值did_idi​, 若满足∣i−j=di ...

  5. 数据结构之并查集:UF-Tree优化并查集——19

    并查集的优化 在上一节了解到并查集的快速查询,合并,判断归属组等操作,虽然这些操作都非常方便,但是在数据量较大的情况下,并查集的效率并不算高: 上一节中实现代码中使用的合并方法(merge,API设计 ...

  6. POJ 并查集 题目汇总 ——czyuan原创(转)

    继续数据结构的复习,本次的专题是:并查集. 并查集,顾名思义,干的就是"并"和"查"两件事.很多与集合相关的操作都可以用并查集高效的解决. 两个操作代码:    ...

  7. 2021年SWPUACM暑假集训day2并查集算法

    什么是并查集 并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的 合并 及 查询 问题. 它支持两种操作: 1.查找(find):确定某个元素处于哪个子集 2.合并(merge):将两个子集 ...

  8. 并查集训练题解(F-J)

    训练链接:http://acm.njupt.edu.cn/vjudge/contest/view.action?cid=173#overview F题 Navigation Nightmare Tim ...

  9. BZOJ 2342 [Shoi2011]双倍回文(manacher+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题目大意] 记Wr为W串的倒置,求最长的形如WWrWWr的串的长度. [题解] ...

  10. leetcode 684. Redundant Connection | 684. 冗余连接(并查集)

    题目 https://leetcode.com/problems/redundant-connection/ 题解 并查集问题 1)有若干个样本a.b.c.d-类型假设是V 2)在并查集中一开始认为每 ...

最新文章

  1. cuda安装教cudnn安装显卡问题
  2. CPU,GPU,GPGPU
  3. html5控件组合,[Vue 3] 教程 – 可复用与组合 – 插件
  4. 年终盘点篇:2018年开源市场5大发展趋势
  5. Android AsyncTask分析
  6. 爬虫+数据分析,制作一个世界疫情人数增长动态柱状竞赛图2
  7. Science上发表的超赞聚类算法
  8. 基于Vue-cli和Vux的webpack配置
  9. python编码解码单词_在使用w2v时python中的编码问题
  10. 编写分段函数子函数_我从编写六个函数中学到的全部都做相同的事情
  11. 提升有监督学习效果的实战解析
  12. Linux系统如何安装VMware(虚拟机)
  13. 大数据学习笔记:距离度量和相似度度量
  14. 测试 REST API,到底应该选择什么样的 VS Code 插件?
  15. python循环的基本思想是重复_python基础-循环
  16. 搭建基于XMPP的即时通讯系统
  17. 居然有比冰点更好的文库下载神器,能下载文库源文档?
  18. xps测试数据处理软件,XPS数据处理时 XPSpeaks 分峰拟合
  19. Snipe-IT部署方案
  20. MOS管的工作原理以及设计理念

热门文章

  1. SDCC 的源码安装
  2. 已知一点经纬度及与另一点距离和航向,求另一点经纬度
  3. 八达岭长城和龙庆峡之游
  4. fastlane二开java_从入门开始使用Fastlane
  5. Google Bot 简介
  6. 居家第二十五天朋友的豆芽菜
  7. Vue.js项目实战——Day(1)
  8. 网游无间道:你所忽略的托儿
  9. 微信授权文件放到域名根目录下
  10. excel 第5讲:分类汇总与数据有效性