并查集(Disjoint Set)
一种特殊的数据结构,用于检查有向图无向图是否存在环
原理:
将边的俩头的的点,放入并查集中 ,如果某条边的俩个点都在并查集集内 ,则该图内有环
难点:如何实现将集合合并
逻辑实现:
建立一个父节点数组;
初始的父节点都被设为了特殊值(例如-1),接下来以边连接的方式来更改父节点,
如果遍历某条边时,如过边的俩个点根节点不同,将其中一个根节点指向另一个,实现俩个集合的归并;(无关系的点进行合并)
如果遍历到某条边的俩端的根节点都在集合内(初始根节点为-1),代表俩点都已经被添加到归并到集合中过了;
而集合内存在链接代表成环
代码合并实现:
// 寻找根节点函数
int findfatherroot(int x,int []parent){
int xroot=x;
while (parent[xroot]!=-1){
xroot=parent[xroot];
}
return xroot;
}
// 判断是否成环函数,运用并查集,成环则返回false,不成环则返回ture
boolean unio(int x,int y,int parent[]){
int xroot=findfatherroot(x,parent);
int yroot=findfatherroot(y,parent);
if(xroot!=yroot){
parent[yroot]=xroot;
return true;
}else {
rls[0]=x;
rls[1]=y;
return false;
}
}