并查集运用在一些连结点问题中 以目前我的理解 用于一些寻找连接点的问题中
比如给你一些前后连接的点 让你判断这些点可以分成几个相互连接的部分
下面来看一下程度的实现
int pre[1000 ];
int find(int x) //查找根节点
{
int r=x;
while ( pre[r ] != r ) //返回根节点 r
r=pre[r ];
return r ;
}
根节点特点r=pre[r] 根据这个特征可以找出根节点 判断一共有多少根节点就能知道有多少个部分 或者多少个图这种一般是边查找根节点 一边进行关系赋值
void unio(int x,int y)
{
int i,j;
i=fin(x);
j=fin(y);
if(i!=j)
pre[x]=y;
}
可以这样实现
在并查集的基础上可以进行缩短路径的算法 把原来多层的关系变成二层关系
代码实现如下
int pre[1000 ];
int find(int x) //查找根节点
{
int r=x;
while ( pre[r ] != r ) //返回根节点 r
r=pre[r ];
int i=x , j ;
while( i != r ) //路径压缩
{
j = pre[ i ]; // 在改变上级之前用临时变量 j 记录下他的值
pre[ i ]= r ; //把上级改为根节点
i=j;
}
return r ;
这样能把路径压缩成简单的二层关系 查找是会简单的多