以下是并查集思路详解:

  一:概念   

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

  二:初始化

    并查集使用时有一个初始化;数组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];
}

 六:例题

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[],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/

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

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

- > 并查集详解(第二节)的更多相关文章

  1. 算法手记 之 数据结构(并查集详解)(POJ1703)

    <ACM/ICPC算法训练教程>读书笔记-这一次补上并查集的部分.将对并查集的思想进行详细阐述,并附上本人AC掉POJ1703的Code. 在一些有N个元素的集合应用问题中,通常会将每个元 ...

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

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

  3. PE文件格式详解,第二讲,NT头文件格式,以及文件头格式

    PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...

  4. IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm(转载)

    IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm 自从本系列发布之后,收到了很多的朋友的回复!非常感谢,同时很多朋友问到了一些问题,有些问 ...

  5. 前端技术之_CSS详解第二天

    前端技术之_CSS详解第二天 1.css基础选择器 html负责结构,css负责样式,js负责行为. css写在head标签里面,容器style标签. 先写选择器,然后写大括号,大括号里面是样式. & ...

  6. 《FPGA设计技巧与案例开发详解-第二版》全套资料包

    本人参与写的一本书(TimeQuest一章由我所写),希望大家多多支持: 全书配套资料上传各大网盘资料中附送大量源码,你值得拥有--<FPGA设计技巧与案例开发详解-第二版>全套资料包-V ...

  7. Redis进阶实践之十五 Redis-cli命令行工具使用详解第二部分(结束)

    一.介绍           今天继续redis-cli使用的介绍,上一篇文章写了一部分,写到第9个小节,今天就来完成第二部分.话不多说,开始我们今天的讲解.如果要想看第一篇文章,地址如下:http: ...

  8. Git应用详解第二讲:Git删除、修改、撤销操作

    前言 前情提要:Git应用详解第一讲:Git分区,配置与日志 在第一讲中我们对Git进行了简单的入门介绍,相信聪明的你已经了解Git的基本使用了. 这一讲我们来进一步深入学习Git应用,着重介绍Git ...

  9. Orchard详解--第二篇 启动

    Orchard Framework作为框架它与类库最大的区别就是框架是将一系列零散的组件组合在一起形成一个整体,接下来就对Orchard Framework如何分析Orchard如何将相关组件结合在一 ...

随机推荐

  1. Python中re操作正则表达式

    在python中使用正则表达式 1.转义符 正则表达式中的转义: '\('表示匹配小括号 [()+*/?&.] 在字符组中一些特殊的字符会现出原形 所有的\s\d\w\S\D\W\n\t都表示 ...

  2. unix_12c_db_init

    sample 1: add a new cdb 1.for the new db  Aprod please apply two new direcotry in Cdb3/Cdb4/Aprod  5 ...

  3. Win7上安装Oracle数据库

    由于ORACLE并没有FOR WIN7的版本,必须下载for vista_w2k8这个版本,将oralce 10G的安装镜像解压到硬盘,然后修改安装目录下的rehost.xml和oraparam.in ...

  4. post登录资料备份

    # coding=utf-8 import urllib import hashlib import http.client import http.cookiejar import http.coo ...

  5. IDEA提示 found duplicate code

    原因: IntelliJ IDEA提示Found duplicated code in this file 这不是我们代码错误,而是idea提示说我们的代码有重复,在项目的其他地方有同样的代码片段 解 ...

  6. VC++函数只被调用一次

    如何保证某个函数只被调用一次   一个函数caller会在其内部调用另外一个函数callee,现在的情况是,caller可能会在多个地方被多次调用,而你希望callee只在第一次被调用时被调用一次.一 ...

  7. 小知识~清除系统盘的Hiberfil.sys

    Hiberfil.sys这个文件是系统休眠用的,时间长了你可能会占用几个G的磁盘空间,有时我们并不需要它,而又无法直接删除,这时,你可以使用CMD命令来关闭这个功能,关闭后,这个文件自动被删除. 1 ...

  8. swift Hashable Equatable

    /// You can use any type that conforms to the `Hashable` protocol in a set or /// as a dictionary ke ...

  9. C++写注册表

    1.       注册表简介 注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件,用于存储系统和应用程序的设置信息.16位驱动在Winnt (Win ...

  10. Spring框架系列(四)--IOC控制反转和DI依赖注入

    背景: 如果对象的引用或者依赖关系的管理由具体对象完成,代码的耦合性就会很高,代码测试也变得困难.而IOC可以很好的解决这个问题,把这 些依赖关系交给框架或者IOC容器进行管理,简化了开发. IOC是 ...