您的位置:首页 > 理论基础 > 数据结构算法

数据结构之并查集小结

2012-07-22 23:29 204 查看
数据结构---并查集小结

             By-Missa

   并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。 (百度百科)

大体分为三个:普通的并查集,带种类的并查集,扩展的并查集(主要是必须指定合并时的父子关系,或者统计一些数据,比如此集合内的元素数目。)

View Code

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 30010
int fa[MAXN],ans[MAXN],sum[MAXN];
int P;
void init()
{
for(int i=0;i<MAXN;i++)
{
fa[i]=i;
ans[i]=0;
sum[i]=1;
}
}
int find(int x)
{
int tmp;
if(x != fa[x])
{
tmp=fa[x];
fa[x]=find(fa[x]);
if(sum[x] != 0)
{
ans[x] += sum[tmp];
sum[tmp] += sum[x];
sum[x] =0;
}
else
{
ans[x] += ans[tmp];
}
}
return fa[x];
}
void unio(int x,int y)
{
int fx=find(x);
int fy=find(y);
fa[fx]=fy;
}
int main()
{
char c;
int a,b;
init();
scanf("%d",&P);
while(P--)
{
getchar();
scanf("%c",&c);
if(c=='M')
{
scanf("%d%d",&a,&b);
unio(a,b);
find(a);//每次合并后都得更新,防止下次合并出错
find(b);
}
else
{
scanf("%d",&a);
find(a);
printf("%d\n",ans[a]);
}
}
}


一点心得:

个人感觉对于那些种类并查集应该都可以用食物链的关系来理解的,通过记录与根结点的关系来判断是否在一个集合。。。刚刚把poj1703翻译成食物链版本,下次试试把上面这些题都翻译成食物链版本。。。。

一些其他的并查集题目汇总:

http://hi.baidu.com/czyuan%5Facm/blog/item/531c07afdc7d6fc57cd92ab1.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: