并查集初步及应用第一页,共七十七页
引例:犯罪团伙1、最小生成树2、细胞个数3、房间问题(noi94)4、代码等式5、银河英雄传说(noi2002)并查集的概念及运算内容:第二页,共七十七页
引例:【犯罪团伙】警察抓到了n个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,但通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识
有可能一个犯罪团伙只有一个人
请你根据已知罪犯之间的关系,确定犯罪团伙的数量
已知罪犯的编号从1至n
输入:第一行:n(=90000;第三页,共七十七页
建立无向图的模型
☻如果x和y认识,结点x和y建立一条无向边
☻求无向图的连通分量(dfs;bfs)☻时间和空间
邻接矩阵:空间太大,超时
邻接表:空间满足,时间查过1s最容易想到的算法:第四页,共七十七页
抽象的算法:◆开始把n个人看成n个独立集合
◆每读入两个有联系的人i和j,查找i和j所在的集合p和q,如果p和q是同一个集合,不作处理;如果p和q属于不同的集合,则合并p和q为一个集合
◆最后统计集合的个数即可得到问题的解
第五页,共七十七页
需要将n个不同的元素划分成一组不相交的集合
开始时,每个元素自己成一个单元素集合,然后按照一定的顺序或问题给定的条件和要求将属于同一组元素(有特定关系)所在的集合合并,最后统计集合的个数往往就是问题的解
在这个过程中要反复的用到查询某个元素属于哪个集合的运算;两个不同集合合并的运算
适合描述这类问题的抽象数据结构类型称为并查集(合并与查找)
一类问题模型:第六页,共七十七页
◆并查集是一种树型的数据结构,用于处理一些不相交集合S={S1,S2,…,Sn},每个集合Si都有一个特殊元素root[Si],称为集合的代表元
◆并查集支持三种操作:Init(X):集合初始化:把元素xi加到集合Si中