并查集

1.将两个集合合并

2.查询两个集合是否在同一个集合中

基本原理:每个集合用同一棵树来表示,树根的编号就是树的编号,每个节点储存其父节点,p[x]表示x的父节点。

问题一:如何判断是否为根节点:if(p[x]==x)

问题二:如何求x的集合编号:int find(int x) {  if(p[x]!=x) p[x]=find(p[x]); return p[x];  } (带路径压缩,递归回溯的过程会直接把节点的父节点指向根节点,减少了以后寻找的时间)

问题三:如何合并两个集合:px是x所在树的编号(也就是根节点),py是y所在树的编号,p[px]=py;令y为根节点,px合并到py树里。

例题

例题1:

一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。

现在要进行 mm 个操作,操作共有两种:

  1. M a b,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
  2. Q a b,询问编号为 a 和 b 的两个数是否在同一个集合中;

输入格式

第一行输入整数 n 和 m。

接下来 m 行,每行包含一个操作指令,指令为 M a b 或 Q a b 中的一种。

输出格式

对于每个询问指令 Q a b,都要输出一个结果,如果 a 和 b 在同一集合内,则输出 Yes,否则输出 No

每个结果占一行。

数据范围

1≤n,m≤1e5  1≤n,m≤1e5

输入样例:

4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4

输出样例:

Yes
No
Yes

AC代码:

#include <iostream>using namespace std;const int N=100010;
int p[N];
int n,m;int find(int x)  //返回x的祖宗结点+路径压缩
{if(p[x] != x) p[x] = find(p[x]);return p[x];
}
int main()
{scanf("%d %d",&n,&m);for(int i=1;i<=n;i++) p[i]=i;char op[2];int a,b;while(m--){scanf("%s%d%d",op,&a,&b);if(op[0]=='M'){if(find(a)!=find(b)) p[find(a)]=find(b);}else{if(find(a)==find(b)) puts("Yes");else puts("No");}}return 0;
}

例题2:

给定一个包含 n 个点(编号为 1∼n)的无向图,初始时图中没有边。

现在要进行 m 个操作,操作共有三种:

  1. C a b,在点 a 和点 b 之间连一条边,a 和 b 可能相等;
  2. Q1 a b,询问点 a 和点 b 是否在同一个连通块中,a 和 b 可能相等;
  3. Q2 a,询问点 a 所在连通块中点的数量;

输入格式

第一行输入整数 n 和 m。

接下来 m 行,每行包含一个操作指令,指令为 C a bQ1 a b 或 Q2 a 中的一种。

输出格式

对于每个询问指令 Q1 a b,如果 aa 和 bb 在同一个连通块中,则输出 Yes,否则输出 No

对于每个询问指令 Q2 a,输出一个整数表示点 aa 所在连通块中点的数量

每个结果占一行。

数据范围

1≤n,m≤1e5

输入样例:

5 5
C 1 2
Q1 1 2
Q2 1
C 2 5
Q2 5

输出样例:

Yes
2
3

AC代码:

#include <iostream>using namespace std;const int N = 100010;
int p[N],cnt[N];
int n,m;int find(int x)
{if(p[x]!=x) p[x]=find(p[x]);return p[x];
}int main()
{cin>>n>>m;for(int i=1;i<=n;i++){p[i]=i;cnt[i]++;}char op[2];int x,y;while(m--){cin>>op;if(op[0]=='C'){cin>>x>>y;if(find(x) != find(y)){cnt[find(y)] +=cnt[find(x)];p[find(x)]=find(y);}}else if(op[1]=='1'){cin>>x>>y;if(find(x)==find(y)) puts("Yes");else puts("No");}else{cin>>x;cout<<cnt[find(x)]<<endl;;}   }
}

——来源ACwing 基础算法 并查集

[基础算法] 并查集相关推荐

  1. UVA10034 Freckles【Kruskal算法+并查集】

    In an episode of the Dick Van Dyke show, little Richie connects the freckles on his Dad's back to fo ...

  2. 【数据结构与算法基础】并查集原理、封装实现及例题解析(C和java)

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  3. 最小生成树kruskal算法并查集版 C语言实现

    今天数据结构课讲了最小生成树的Kruskal算法和Prim算法,不过都只是概念,可能是怕他们听不懂吧,反正算法实现一概不讲...囧 下午抱着<算法导论>跑去图书馆看Kruskal算法,发现 ...

  4. Kruscal算法+并查集 求解最小生成树

    http://ac.jobdu.com/problem.php?pid=1347    孤岛连通工程 刚开始的时候使用qsort排序函数进行排序提交一直都是TLE,后来无意中改为sort排序函数提交就 ...

  5. 最小生成树KrusKal算法(并查集)

    洛谷p1111链接 克鲁斯卡尔算法的思路就是由森林变成树的过程,其中最主要的就是贪心和并查集的应用. 我们知道链接n个点需要n-1条边,这就满足的最后生成的是一颗树,而不是一个环.在这n-1条边的选择 ...

  6. 还是畅通工程(克鲁斯卡尔算法+并查集)

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  7. 最小生成树Kruskal算法+并查集检查连通

    /* 10 6 1 2 6 1 3 1 1 4 5 2 3 5 2 5 3 3 4 5 3 5 6 3 6 4 4 6 2 5 6 6 */// 本例解决最小生成树问题 // 并查集来加快效率 // ...

  8. HDOJ 1863畅通工程(最小生成树kruskal算法并查集实现)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1863 最小生成树kruskal算法:http://www.zhuoda.org/irini/78592.h ...

  9. HDU1875 畅通工程再续【Kruskal算法+并查集】

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

最新文章

  1. 树莓派共享文件至电脑(samba)
  2. 做一个快乐的产品经理
  3. Ubuntu常用服务器环境搭建——Nginx+PHP篇
  4. 解析浏览器访问服务器 Servlet 应用程序的交互过程(Servlet 容器如何处理请求资源路径)
  5. linux下分析cel文件,详细解析Linux scp命令的应用
  6. cm如何查看各个组件版本_Oracle HowTo:查询Oracle各组件的版本信息
  7. 如何访问个人邮箱中的未读邮件
  8. 学习React之前你需要知道的的JavaScript基础知识
  9. 华为认证考试在哪里考比较靠谱?
  10. c语言编程怎样进行反函数计算器,反函数计算器
  11. 高端物理学名词_物理专业名词
  12. 极值点、驻点、拐点的区别和联系
  13. 苹果手机怎么隐藏照片?给iPhone相册上锁的3种方法
  14. 【Spring Cloud】新闻头条微服务项目:自媒体前后端搭建素材管理(含优化)
  15. “健康童乐园”10000户落成促进乡村儿童身心智全面健康成长
  16. 详解HTML的相对路径写法
  17. springboot整合多线程ThreadPoolTaskExecutor
  18. oracle12c cc 功能,Oracle Database12c新特性:新增加的后台进程
  19. 运用BBS营销成功案例并分析
  20. 统计|如何处理数据处理中的缺失值?

热门文章

  1. 【测试算法】深入浅出Pairwise 算法
  2. 树莓派安装Windows
  3. htonl(), ntohl(), htons(), ntohs() 函数具体应用
  4. 最长公共子序列变种——带权的最长公共子序列
  5. 华为鸿蒙os2.0系统是什么,6月2日,华为鸿蒙2.0手机系统正式登场!苹果有什么动作?...
  6. android 面试题(三)
  7. 数据挖掘与数据分析(快速入门)
  8. 冒泡排序法(C语言实现)
  9. intellij idea自动提示方法快捷键
  10. Excel中F4键的作用