并查集

顾名思义,并查集有三个用处

  • 并,即合并两个集合

  • 查,查询该元素所在的集合

  • 集,就指集合

现在来说一说并查集的基本操作:

- 初始化

首先,最开始的时候,我们假设所有的集合都只有一个元素,即只有自己(自己是自己的爸爸。。。)。所以简单初始化:

   for(int i=1;i<=num;i++){

        father[i]=i;

        }

那么很好理解,如果你们的祖先一定是一个人,那你们是一家人对吧,所以 有公共祖先的两个元素在同一集合内

现在,我们可以对这num个集合操作了

- 认亲

我们把并查集的名字设为father,那么合并集合是不是就是认亲啊 = =;

好吧 再通俗点叫认祖宗


a:诶我们家没钱了QAQ

b:没事 我们家可以收养你

a:我还有一家人(数不清的爸爸们QAQ)挨饿啊

b:没事没事,我们家有的是钱,让你祖宗认我们家祖宗是爸爸,我们就是一家人了呗QVQ

a:是哦!!!!!


好吧,有点扯,不过就是这么回事(findfather函数参见下面的找爸爸)

    void Union(int a,int b){
int faA=findfather(a);//找a祖宗
int faB=findfather(b);//找b祖宗
if(faA!=faB){
father[faA]=faB;//认爸爸
}
}

- 找爸爸

顾名思义,就是找你的爸爸的爸爸的爸爸(递归一波:) )

a:我看看。。。诶我祖宗是G诶

b:卧槽 我祖宗也是G

a+b:诶哟一家人

    int father[maxn];
int findfather(int x){
while(x!=father[x]){//一直找到祖先为止
x=father[x];
}
return x;
}

实现的是并查集中 的作用,很好理解,就是像一条线一样,顺着线的源头一直找下去,直到找到一个自己的源头是自己元素,那么那个源头就是最大的爸爸了(就你那个老不死祖先QwQ)

但这种找发也有不足:如果G是a的 55555 代祖宗,那么a不是要找 55555 次才能找到?那不得累死QAQ

这样的一条链大大降低了找爸爸的效率

所以我们需要对其进行优化,不妨这样:

每次找到(最大)祖先,就替换自己的爸爸

理解如下,father[i]的值现在不代表i的爸爸了,而代表i的最大祖先


a:祖先?我看看

(打开族谱,发现只有一页:你的祖先是G

我的祖先是G

b:哦哦,我看看我的

(然后翻了55555页,每一页都是 { x的爸爸是Y } ,最后终于找到了father[G] = G)

f*ck,终于翻到了,我祖先是G


一对比,就发现路径压缩的好处了

具体代码实现:

    int findfather(int v){
if(father[v]==v){
return v;//找到祖宗了= =
}
else{
int F=findfather(father[v]);//记住你祖宗
father[v]=F;//修改一下祖宗
return F;//一层一层回去
}
}

不过路径压缩的同时,也会出现一个问题

路人:诶,你们是你们家第几代啊?

a:(看着“你祖宗是G”)。。。

b:(翻那本族谱)我是55555代!!!


看到问题了吧

有关具体请参考 -并查集进阶版-

- 有关题目

刚接触并查集时,发现就几类题目:找亲戚,分组,通路...

诶哟,又不难啊哈哈哈

恩咳咳,后面发现不难个屁

那么好的,我们现在分析这类题目怎么写

首先,我们需要知道什么题面需要用到并查集

并查集一般涉及:

联通

想想,怎么把两块东西连在一起?

一个集合可以称作一个联通的块,连在一起就认祖宗呗

这就是最简单的并查集问题


P1551 亲戚

题目背景

若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。

题目描述

规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。


P2839 畅通工程

题目描述

某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?

通常的,最简单并查集有一下几个考点

  1. 询问两点是否联通

(日常找爸爸【祖宗】)

  1. 询问有几个块

转换为找有几家人,再转换为找有几个老不死的祖宗:遍历所有点,若father[i] == i,就又找到一家)

  1. 还有的就自己动脑,哪那么多总结QVQ

这里归纳的是并查集的基础,掌握好基本操作,做几道板题,熟悉一下提醒,相信很快就能掌握


其实 后面 并查集 难到爆 一点都不难QAQ

有关并查集的emmmm的更多相关文章

  1. (最小生成树 并查集)P1111 修复公路 洛谷

    题目背景 A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你什么时 ...

  2. 【学术篇】NOI2015 品酒大会 后缀数组+并查集

    省选前大致是刷不了几道题了... 所以就找一些裸一点的题目练练板子算了= = 然而这题一点都不裸, 也并不怎么好写... 于是就浪费了将近一下午的时间... 然而还不是因为后缀数组板子不熟= = 首先 ...

  3. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  4. 关押罪犯 and 食物链(并查集)

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...

  5. 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

    图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...

  6. bzoj1854--并查集

    这题有一种神奇的并查集做法. 将每种属性作为一个点,每种装备作为一条边,则可以得到如下结论: 1.如果一个有n个点的连通块有n-1条边,则我们可以满足这个连通块的n-1个点. 2.如果一个有n个点的连 ...

  7. [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)

    Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...

  8. [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  9. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

随机推荐

  1. 实验五Java网络编程及安全

    实验五 Java网络编程及安全 结对伙伴:20135231林涵锦(负责服务器方)http://www.cnblogs.com/20135213lhj/  实验目的与要求: 1.掌握Java网络编程的方 ...

  2. 20135234mqy-——信息安全系统设计基础第三周学习总结

    (1)计算机将信息按位编码,通常组成字节序列.用不同的编码方式表示整数,师叔和字符串.不同的计算机模型在编码数字和多字节数据中的字节排序时使用不同的约定. (2)C语言的设计可以包容多种不同字长和数字 ...

  3. java 第一次实验报告

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1353  姓名:黎静  学号:20135338 成绩:             指导教师:娄嘉鹏  ...

  4. C# Linq找不到行或已更改

    前段时间工作中的一个新需求,有机会用到了Linq to SQL.使用后的第一感觉,就是方便很多,也为整个项目节约了一大把的开发时间,甚至代码量也少了很多.不过在程序的实际运行中,始终会遇到一些莫名其妙 ...

  5. 第1阶段冲刺成果—简单运算game(APP)

    第1阶段冲刺成果 由于我们团队都没有Android的基础,所以在这一块花了很长的时间去学习探索,就连简单的Android的电脑配置也花了很长的时间,所以其他的DONE的都没有完成,这是失败的地方.但是 ...

  6. Socket 记录

    心跳检测步骤:1客户端每隔一个时间间隔发生一个探测包给服务器2客户端发包时启动一个超时定时器3服务器端接收到检测包,应该回应一个包4如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器5如果 ...

  7. 解决tomcat登录需要给角色授权

    1:编辑/usr/local/tomcat/conf/tomcat-users.xml文件,在没有注释的内容中添加: <role rolename="manager-gui" ...

  8. 转载LoadRunner的常用Java API

    Java API是访问Vuser函数的基础,通过LoadRunner的Java API可以在脚本中很容易地创建事务与并发点.获取用户信息等功能. 1. 事务函数(Transaction Functio ...

  9. 【转载】Vue项目中的文件/文件夹命名规范

    文件或文件夹的命名遵循以下原则: index.js 或者 index.vue,统一使用小写字母开头的(kebab-case)命名规范 属于组件或类的,统一使用大写字母开头的(PascalCase)命名 ...

  10. SQLSERVER 使用XP开头的系统默认存储过程

    1. 根据官网上面的内容进行执行命令 EXEC xp_cmdshell 'dir *.exe'; 但是会报错 消息 ,级别 ,状态 ,过程 xp_cmdshell,行 [批起始行 ] SQL Serv ...