并查集是非常常用的一种数据结构,用于把数据按照规则整理成集合,集合最终呈现为树状结构,以根节点作为不同集合的区分标志,实现方面主要涉及查找和合并,代码如下
//查找
int find(int x)
{
int r=x;
while(pre[r]!=r)
r=pre[r];//找到他的前导结点
int i=x,j;
while(i!=r)//路径压缩算法
{
j=pre[i];//记录x的前导结点
pre[i]=r;//将i的前导结点设置为r根节点
i=j;
}
return r;
}
//合并
void UnionSet(int x, int y){
int xp = find(x);
int yp = find(y);
pre[xp] = yp;
}
代码不难理解,其目的就是为了构建一个森林将离散的数据变成集合,这里我们学习如何用并查集判断图的环路,并查集判断图的方法是按边合并集合,对于图,我们可以做一个邻接矩阵或者直接按边来遍历合并集合(每个边遍历一次),当遍历一条边出现两个顶点早就处于同一个集合时即可判定有环路。
以51Nod-1416为例:
福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”。基础级别的时候是在一个n×m单元上玩的。像这样: