- > 并查集详解(第二节)
以下是并查集思路详解:
一:概念
二:初始化
并查集使用时有一个初始化;数组fa[i]记录了点i的父亲(掌门)是谁;
所以,我们可以理解成一开始时门派公司还没发展起来,每个人单打独斗,自己是自己的掌门(父亲);
代码:
for(int i=;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];
}
六:例题
有这么一种说法:认识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[],b[],fa[],v[],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=;i<=n;i++)
fa[i]=i;
for(int i=;i<=m;i++){
cin>>a[i]>>b[i];
fa[find(b[i])]=find(a[i]);//b[i]的掌门变成a[i]的掌门;
}
for(int i=;i<=n;i++)
fa[i]=find(i);
for(int i=;i<=n;i++)
v[fa[i]]++;
for(int i=;i<=n;i++){
if(v[i]>)
sum++;
}
if(sum<=)
cout<<"^_^";
else
{
sort(v+,v++n);
for(int i=n;i>=n-;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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>完
- > 并查集详解(第二节)的更多相关文章
- 算法手记 之 数据结构(并查集详解)(POJ1703)
<ACM/ICPC算法训练教程>读书笔记-这一次补上并查集的部分.将对并查集的思想进行详细阐述,并附上本人AC掉POJ1703的Code. 在一些有N个元素的集合应用问题中,通常会将每个元 ...
- C#关键字详解第二节
base:基类 在有些书中base的解释为表示父类,没错,base可以表示父类,但我更想理解成基类,因为更原始更具象,既 然是类,那么他就符合面向对象的设计规则和特点,我们知道面向对象的三个特点是封装 ...
- PE文件格式详解,第二讲,NT头文件格式,以及文件头格式
PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...
- IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm(转载)
IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm 自从本系列发布之后,收到了很多的朋友的回复!非常感谢,同时很多朋友问到了一些问题,有些问 ...
- 前端技术之_CSS详解第二天
前端技术之_CSS详解第二天 1.css基础选择器 html负责结构,css负责样式,js负责行为. css写在head标签里面,容器style标签. 先写选择器,然后写大括号,大括号里面是样式. & ...
- 《FPGA设计技巧与案例开发详解-第二版》全套资料包
本人参与写的一本书(TimeQuest一章由我所写),希望大家多多支持: 全书配套资料上传各大网盘资料中附送大量源码,你值得拥有--<FPGA设计技巧与案例开发详解-第二版>全套资料包-V ...
- Redis进阶实践之十五 Redis-cli命令行工具使用详解第二部分(结束)
一.介绍 今天继续redis-cli使用的介绍,上一篇文章写了一部分,写到第9个小节,今天就来完成第二部分.话不多说,开始我们今天的讲解.如果要想看第一篇文章,地址如下:http: ...
- Git应用详解第二讲:Git删除、修改、撤销操作
前言 前情提要:Git应用详解第一讲:Git分区,配置与日志 在第一讲中我们对Git进行了简单的入门介绍,相信聪明的你已经了解Git的基本使用了. 这一讲我们来进一步深入学习Git应用,着重介绍Git ...
- Orchard详解--第二篇 启动
Orchard Framework作为框架它与类库最大的区别就是框架是将一系列零散的组件组合在一起形成一个整体,接下来就对Orchard Framework如何分析Orchard如何将相关组件结合在一 ...
随机推荐
- JD笔试
题目表述: 给定n道题目,以及每道题目答对的概率,问小明能及格的概率. 样例: 40 50 50 50 50 0.31250 思路: 递归枚举对的题目个数,最后TLE之过40%: 知道正确解法是DP, ...
- 365 Water and Jug Problem 水壶问题
有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水.你允许: 装满任 ...
- Geoserver常见问题总结
原文地址 :http://blog.csdn.net/mygisforum/article/details/8249093 http://www.cnblogs.com/wang985850293/p ...
- oracle性能优化培训总结
- C语言用指针输出数组里的值
因为*(arr)是指arr数组内存编号所对应的首地址的值,即arr[0]的值.所以用*(arr+i)可以实现遍历整个数组.
- Android 网络图片查看器与网页源码查看器
在AndroidManifest.xml里面先添加访问网络的权限: <uses-permission android:name="android.permission.INTERNET ...
- [oracle]表空间情况查看、占用、扩容、使用情况、空间维护等操作
--查询表空间使用情况SELECT Upper(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB ...
- MFC_2.3 定时器、滑块、进度条控件
定时器.滑块.进度条控件 1.拖控件 2.绑定变量.默认,然后取名字 3.初始化设置定时器 // 设置滑块和进度条的范围 m_TrackBar.SetRange(0, 1000); m_StaticP ...
- CAD指定区域绘制一个jpg文件
主要用到函数说明: _DMxDrawX::DrawToJpg 把指定区域的内容绘制一个jpg文件中.详细说明如下: 参数 说明 BSTR sJpgFilePath Jpg文件名 DOUBLE dLbx ...
- 使用lombok注解@Getter @Setter方法代码编译成功,但是没有生成get,set方法
现象描述: 在对应类对象中,添加lombok的@Getter或@Setter注解,编译没有问题,但是在使用类对象时,没有出现对应的get或set方法. 配置且编译ok,但是没有对应的get或set方法 ...