- 并查集详解(第二节)
以下是并查集思路详解:
一:概念
二:初始化
并查集使用时有一个初始化;数组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个朋友
有这么一种说法:认识6个人,你就认识全世界的人。
Aiden现在有一张关系图,上面记载了N个人之间相互认识的情况。Aiden想知道,他能否只认识6个人就能间接认识这N个人呢?
第一行,两个数N,M,表示有N个人,M对认识关系。
接下来的M行,每行两个数ai,bi,表示ai与bi相互认识。
不保证认识关系不出现重复,保证ai≠bi。
N个人的编号为1...N。
若只认识6个人就能间接认识这N个人,则输出“^_^”。
若不行,则第一行输出“T_T”,第二行输出认识6个人最多能间接认识的人的个数。
输出不包括引号。
6 7
1 2
1 3
2 4
3 5
4 6
5 6
3 2
^_^
对于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
- 并查集详解(第二节)相关推荐
- 并查集详解 ——图文解说,简单易懂(转)特别好玩
并查集详解 --图文解说,简单易懂(转) 2016年03月10日 17:38:08 阅读数:6931 标签: 并查集数据结构并查集算法图文解说 更多 个人分类: 算法--并查集 并查集是我暑假从高手那 ...
- 拓扑排序 详解 + 并查集 详解 + 最小生成树详解
若您发现本文有什么错误,请联系我,我会及时改正的,谢谢您的合作! 本文为原创文章,转载请注明出处 本文链接 : http://www.cnblogs.com/Yan-C/p/3943940.htm ...
- 数据结构(八):并查集详解 (多图+动图)
目录 一.什么是并查集 二.并查集的存储结构 三.并查集的基本操作 (一)初始化 (二)Find操作 (三)Union操作 四.并查集的优化 (一)Union操作优化(小树并入大树) (二)Find操 ...
- [数据结构、读书笔记、C++] 并查集详解
介绍 并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的 合并及查询 问题. 其主要操作为: Union(合并) :将两个节点所在集合合并为一个集合 Find (查询) ...
- 并查集详解: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 ...
- 并查集详解(从引入到代码)
江湖上散落着各式各样的大侠,有上千个之多.他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架.但大侠们有一个优点就是讲义气,绝对不打自己的朋友.而且他们信奉&qu ...
- C#关键字详解第二节
base:基类 在有些书中base的解释为表示父类,没错,base可以表示父类,但我更想理解成基类,因为更原始更具象,既然是类,那么他就符合面向对象的设计规则和特点,我们知道面向对象的三个特点是封装, ...
- 7-3 最小生成树-kruskal (10 分)(思路+详解+并查集详解+段错误超时解决)宝 Come
一:前言 本题需要用到并查集的知识,建议先学完并查集后再看看本题 二:题目 题目给出一个无向连通图,要求求出其最小生成树的权值. 温馨提示:本题请使用kruskal最小生成树算法. 输入格式: 第一行 ...
- 一个很有意思的并查集详解
并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) ...
最新文章
- AJPFX关于多态的应用
- java jxl poi_「excle下载」java实现下载excle(jxl、poi 两种方式) - seo实验室
- 【python】for..range练习 与函数的练习题
- 【调试手段】之valgrind在ARM上的交叉编译
- 爬虫之Requests库
- 查看Unix系统是32位还是64位
- Android 自定义View可拖动移动位置及边缘拉伸放大缩小
- Php程序监控邮件提醒linux,Linux ping命令实现网络监控 并邮件提醒管理员
- VOIP Codec 三剑客之 ISAC/ILBC -- ISAC (6) Spectrum Encode 模块
- 微信支付跨平台软件架构
- 亲爱的朋友,祝您天天好心情!
- 猫哥教你写爬虫 029--爬虫初探-requests
- 真实渗透改编--综合渗透 sql注入写马+文件上传+udf提权 安鸾靶场SQL注入学习
- 服务器可以装win7或win10系统吗,win10改win7用legacy还是uefi?_网站服务器运行维护,window...
- Excel单元格首位数字为“0”不显示的问题
- 6-3 每个单词的首字母改为大写 (10 分)
- 国产热门操作系统Deepin试用感受
- angr学习之ctf练习
- 【概率图与随机过程】06 朴素贝叶斯:基于条件独立性假设
- 第七十篇:从ADAS到自动驾驶(三):车道检测