并查集
先来个容易理解的并查集,特别容易理解
http://blog.csdn.net/dellaserss/article/details/7724401/
总结一下:
并查集其实就是维护了几个动态的集合,集合中的每一个元素都标记了一个父节点,同一个集合的父节点是相同的。当一个元素的父节点就是它本身时,它就是这个集合的代表。
并查集有三种操作:
1<make(x) 用于初始化集合,将每个元素的父节点设置为它本身,即每一个元素都为一个集合,互相没有联系。
2<find(x) 找到x所在集合的父节点即代表。
3<join(x,y) 合并x和y所在的集合,即把y的代表设置为x所在集合的代表。
这里用数组实现,pre[i]的值就是i的父节点
初始化 (假设有t个元素):把每一个元素的父节点都设置为它自己
void make(int t)//初始化
{
for(int i=1;i<=t;i++)
pre[i]=i;
}
寻找x的父节点
int Find(int x)
{
int r=x;
while(r!=pre[r])//找到x的父节点
r=pre[r];
int i=x,j;
while(i!=r)//缩短路径,把x的上级的父节点都设为pre[r]
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
void join(int x,int y)//合并
{
int fx=Find(x),fy=Find(y);
if(fx!=fy)
pre[fx]=fy;
}
并查集的上手题 hdu1232
链接: http://blog.csdn.net/blesslzh0108/article/details/53636311
链接: http://blog.csdn.net/blesslzh0108/article/details/53636311