以下是并查集思路详解:

  一:概念   

    并查集处理的是“集合"之间的关系。当给出两个元素的一个无序数对(a,b)时,需要快速“合并”a和b分别所在的集合,这期间需要反复“查找”某元素所在的集合。“并”,“查”,“集”三个字由此而来。
    并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。
    常常在使用中以森林来表示。
    集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并。
    在一些有N个元素的集合应用问题中,通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。
    这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高。所以,我们在此引入了并查集;

  二:初始化

    并查集使用时有一个初始化;数组fa[i]记录了点i的父亲(掌门)是谁;

    所以,我们可以理解成一开始时门派公司还没发展起来,每个人单打独斗,自己是自己的掌门(父亲);

代码:

for(int i=1;i<=n;i++)fa[i]=i;

  三:查找

    用一个judge函数查找自己和对方是否为同一个门派(公司,家族)的人,即他们的掌门(祖宗)是否为同一个人;

代码:

bool judge(int x,int y)
{x=find(x);y=find(y);if(x==y)    return true;else return false;
}

  四:合并

    经过查找后如果两元素不在同一集合,那么用一个函数unionn合并两元素所在集合;

代码:

void unionn(int x,int y)
{x=find(x);y=find(y);fa[y]=x;
}

  五:寻找根节点(路径压缩)

代码:

int find(int x)
{if(fa[x]!=x)    fa[x]=find(fa[x]);    //如果该元素还有上级就继续找;最后该元素的上司会直接被置为门派掌门(公司CEO); return fa[x];
}

 六:例题

2832 6个朋友

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold

题解
 

题目描述 Description

     有这么一种说法:认识6个人,你就认识全世界的人。

  Aiden现在有一张关系图,上面记载了N个人之间相互认识的情况。Aiden想知道,他能否只认识6个人就能间接认识这N个人呢?

输入描述 Input Description

  第一行,两个数N,M,表示有N个人,M对认识关系。

  接下来的M行,每行两个数ai,bi,表示ai与bi相互认识。

  不保证认识关系不出现重复,保证ai≠bi。

  N个人的编号为1...N。

输出描述 Output Description

  若只认识6个人就能间接认识这N个人,则输出“^_^”。

  若不行,则第一行输出“T_T”,第二行输出认识6个人最多能间接认识的人的个数。

  输出不包括引号。

样例输入 Sample Input

  6 7

  1 2

  1 3

  2 4

  3 5

  4 6

  5 6

  3 2

样例输出 Sample Output

  ^_^

数据范围及提示 Data Size & Hint

  对于30%的数据,保证0<n≤1000。

  对于50%的数据,保证0<n≤5000。

  对于100%的数据,保证0<n≤10000,m≤10*n。

思路:裸并查集

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,a[1000000],b[1000000],fa[1000000],v[1000000],sum,ans;
//注意数组大小,n<=100000,开100001的数组不行;此题略坑;
int find(int x)
{if(fa[x]!=x)return find(fa[x]);else return x;
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++)    fa[i]=i;for(int i=1;i<=m;i++){cin>>a[i]>>b[i];fa[find(b[i])]=find(a[i]);//b[i]的掌门变成a[i]的掌门;
    }for(int i=1;i<=n;i++)fa[i]=find(i);for(int i=1;i<=n;i++)v[fa[i]]++; for(int i=1;i<=n;i++){if(v[i]>0)sum++;    }if(sum<=6)cout<<"^_^";else{sort(v+1,v+1+n);for(int i=n;i>=n-5;i--)ans+=v[i];    cout<<"T_T"<<endl;cout<<ans;}
}

作者:一蓑烟雨任生平

材料网址:http://www.cnblogs.com/cyjb/

   http://blog.csdn.net/dellaserss/article/details/7724401/

     http://codevs.cn/problem/2832/

     http://codevs.cn/problem/1995/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>完

转载于:https://www.cnblogs.com/cangT-Tlan/p/6297312.html

- 并查集详解(第二节)相关推荐

  1. 并查集详解 ——图文解说,简单易懂(转)特别好玩

    并查集详解 --图文解说,简单易懂(转) 2016年03月10日 17:38:08 阅读数:6931 标签: 并查集数据结构并查集算法图文解说 更多 个人分类: 算法--并查集 并查集是我暑假从高手那 ...

  2. 拓扑排序 详解 + 并查集 详解 + 最小生成树详解

    若您发现本文有什么错误,请联系我,我会及时改正的,谢谢您的合作! 本文为原创文章,转载请注明出处 本文链接   : http://www.cnblogs.com/Yan-C/p/3943940.htm ...

  3. 数据结构(八):并查集详解 (多图+动图)

    目录 一.什么是并查集 二.并查集的存储结构 三.并查集的基本操作 (一)初始化 (二)Find操作 (三)Union操作 四.并查集的优化 (一)Union操作优化(小树并入大树) (二)Find操 ...

  4. [数据结构、读书笔记、C++] 并查集详解

    介绍 并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的 合并及查询 问题. 其主要操作为: Union(合并) :将两个节点所在集合合并为一个集合 Find (查询) ...

  5. 并查集详解:UF——UF_Tree——UF_Tree_Weighted逐步优化

    目录 1 并查集简介 2 UF 2.1 UF(int N)构造方法实现 2.2 union(int p, int q)合并方法实现 2.3 代码实现(Java) 2.4 应用举例与复杂性分析 3 UF ...

  6. 并查集详解(从引入到代码)

    江湖上散落着各式各样的大侠,有上千个之多.他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架.但大侠们有一个优点就是讲义气,绝对不打自己的朋友.而且他们信奉&qu ...

  7. C#关键字详解第二节

    base:基类 在有些书中base的解释为表示父类,没错,base可以表示父类,但我更想理解成基类,因为更原始更具象,既然是类,那么他就符合面向对象的设计规则和特点,我们知道面向对象的三个特点是封装, ...

  8. 7-3 最小生成树-kruskal (10 分)(思路+详解+并查集详解+段错误超时解决)宝 Come

    一:前言 本题需要用到并查集的知识,建议先学完并查集后再看看本题 二:题目 题目给出一个无向连通图,要求求出其最小生成树的权值. 温馨提示:本题请使用kruskal最小生成树算法. 输入格式: 第一行 ...

  9. 一个很有意思的并查集详解

    并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) ...

最新文章

  1. AJPFX关于多态的应用
  2. java jxl poi_「excle下载」java实现下载excle(jxl、poi 两种方式) - seo实验室
  3. 【python】for..range练习 与函数的练习题
  4. 【调试手段】之valgrind在ARM上的交叉编译
  5. 爬虫之Requests库
  6. 查看Unix系统是32位还是64位
  7. Android 自定义View可拖动移动位置及边缘拉伸放大缩小
  8. Php程序监控邮件提醒linux,Linux ping命令实现网络监控 并邮件提醒管理员
  9. VOIP Codec 三剑客之 ISAC/ILBC -- ISAC (6) Spectrum Encode 模块
  10. 微信支付跨平台软件架构
  11. 亲爱的朋友,祝您天天好心情!
  12. 猫哥教你写爬虫 029--爬虫初探-requests
  13. 真实渗透改编--综合渗透 sql注入写马+文件上传+udf提权 安鸾靶场SQL注入学习
  14. 服务器可以装win7或win10系统吗,win10改win7用legacy还是uefi?_网站服务器运行维护,window...
  15. Excel单元格首位数字为“0”不显示的问题
  16. 6-3 每个单词的首字母改为大写 (10 分)
  17. 国产热门操作系统Deepin试用感受
  18. angr学习之ctf练习
  19. 【概率图与随机过程】06 朴素贝叶斯:基于条件独立性假设
  20. 第七十篇:从ADAS到自动驾驶(三):车道检测

热门文章

  1. QT开发调用FDTI ftd2xx.dll库
  2. 2022-2028年中国汽车儿童安全座椅行业发展前景分析及市场需求预测报告
  3. 【题】【矩阵】NKOJ 1901 喜欢奇数的面包师
  4. 2026:【例4.12】阶乘和
  5. C语言.h文件的作用
  6. 【读论文-笔记】——2.沐神读Resnet
  7. 机器学习在算法交易中的应用现状
  8. 【文本文件与二进制文件的区别;文件打开与关闭的方法、不同读写方式】(学习笔记19--文件上)
  9. 从银行业客服模式进化看联络中心智能化趋势
  10. “醒醒吧,世界上有技术驱动型公司!”