并查集基础笔记

并查集是通过找祖宗的方式,将分散的各个元素联系起来,形成一个个集合(组织)的一种数据结构或者说操作。

1.查找(寻找祖宗)

1 int Find(int x)
2 {
3 
4     while(x!=father[x])//若祖宗值f[x]和自己x不同,说明另有其人
5         x=father[x];//直到找到祖宗根节点
6     return x;    
7 }

2.合并(集中)。分散的各个点,通过给出两两的关系,进行合并。假设1和2是同类,那么指定一个方向(祖宗,假如以右边的为祖宗)。

1 void merge(int a,int b)
2 {
3     int fa=Find(a);//寻找a的祖宗
4     int fb=Find(b);//寻找b的祖宗
5     if(fa!=fb)//如果a和b的祖宗不同
6     {
7         father[fa]=fb;//a成为b的部下(即a的祖宗从自己变成了b(的祖宗))
8     }
9 }

3.通过遍历父亲节点,找到f[x]==x的个数,即为集合的个数。(每个集合有唯一的祖宗)

题目:

1.hdu1213 How Many Tables

2.hdu1232 畅通工程

2.poj2236 Wireless Network

3.poj1611 The Suspects

4.poj1456 Supermarket

原文地址:https://www.cnblogs.com/theshorekind/p/12576516.html