------------Snowbee3012
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
基本操作:
Father[x]; //表示x的父亲
初始化:
Father[i]=i; // i = 0 ----n
合并两个不相交集合:
操作很简单:先设置一个数组Father[x],表示x的“父亲”的编号。 那么,合并两个不相交集合的方法就是,找到其中一个集合最父亲的父亲(也就是最久远的祖先),将另外一个集合的最久远的祖先的父亲指向它。
void Union(int x ,int y)
{
x=GetFather(x); //获得最久远的祖先
y=GetFather(y);
if(x!=y)Father[x]=y; //把 y 设置为x的父亲
}
获得祖先:路径压缩
int GetFather(int x)
{
if(x == Father[x])return x;
else Father[x]=GetFather(x); //路径压缩,对每个路径上的节点都
return Father[x]; //赋予其祖先节点
}
具体实例:
假设有一群编号的人,给出其中一些人认识的关系 (x,y)表示x认识y
(x,y) (y,z) ---> (x,y,z)
给出几组关系
(1,2) (3,5) (5,2) (4,1)
初始化:
Father[1]=1 Father[2]=2 Father[3]=3 Father[4]=4 Father[5]=5
(1,2)
Father[1]=2 Father[2]=2 Father[3]=3 Father[4]=4 Father[5]=5
(3,5)
Father[1]=2 Father[2]=2 Father[3]=5 Father[4]=4 Father[5]=5
(5,2)
Father[1]=2 Father[2]=2 Father[3]=5 Father[4]=4 Father[5]=2
(4,1)
Father[1]=2 Father[2]=2 Father[3]=5 Father[4]=2 Father[5]=2
最终查找:
if(i==GetFather(i))result++;1 : Father[1]=2
2: Father[2]=2
3: Father[3]=2
4: Father[4]=2
5: Father[5]=2
即在最后查找的一步,对所有元素都赋给其祖先
acm.hdu.edu.cn 并查集题目:
1213 2473 1879 1233 1875 1863 1856 1272
以上内容参照维基百科