以下是并查集思路详解:

  一:概念   

    并查集处理的是“集合"之间的关系。当给出两个元素的一个无序数对(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. Lightoj 1010 - Knights in Chessboard (胡搞)

    题目连接: http://www.lightoj.com/volume_showproblem.php?problem=1010 题目描述: 有一个n*m的棋盘,根据象棋中马走日字的规则,问此棋盘最多 ...

  2. 51nod1344 走格子

    1344 走格子 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格 ...

  3. 最大流增广路(KM算法) HDOJ 2255 奔小康赚大钱

    题目传送门 /* KM:裸题第一道,好像就是hungary的升级版,不好理解,写点注释 KM算法用来解决最大权匹配问题: 在一个二分图内,左顶点为X,右顶点为Y,现对于每组左右连接Xi,Yj有权w(i ...

  4. 数据传递-------@ResponseBody

    1.导入jar包 jack-core-asl-1.9.11.jar jack-mapper-asl-1.9.11.jar 2.配置springmvc-servlet.xml文件 <?xml ve ...

  5. Spring Boot (27) actuator服务监控与管理

    actuaotr是spring boot项目中非常强大的一个功能,有助于对应用程序进行监控和管理,通过restful api请求来监管.审计.收集应用的运行情况,针对微服务而言它是必不可少的一个环节. ...

  6. 观察者模式(observer)c++实现

    1意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 2别名 依赖(Dependents), 发布-订阅(Publish-Subscribe ...

  7. Fiddler抓取Intellij Idea中执行的web网络请求

    首先可以打开命令行 输入:ipconfig 找到本机配置的IP地址 这里是: 192.168.97.122 或者打开Fiddler 点击如下图片中的小三角符号:将鼠标放在online的位置,也可以看到 ...

  8. Linux系统命令及文件的浏览、管理和维护

    在linux中什么是一个文件的路径呢,说白了就是这个文件存在的地方,例如在上一章提到的/root/.ssh/authorized_keys 这就是一个文件的路径.如果你告诉系统这个文件的路径,那么系统 ...

  9. PHP引用(&)的考察点

    引用的概念 在PHP中引用意味着用不同的名字访问同一个变量内容. 定义方式 使用 & 符号来表示 变量的引用 $a = 'ABC'; //开辟一块内存空间存储数据,$a指向该空间 $b = & ...

  10. Java基础——工具类

    一Java 常用类 Object Object类是所有类.数组.枚举类的父类.位于Java.lang包.也就是说,Java允许把任意类型的对象赋给Object类型的变量. Object类的常用方法 1 ...