并查集的父节点数组正确建立的关键是:
用union(join)建立边关系。
并查集一般用来数连通图个数。
class Solution {
public int findCircleNum(int[][] isConnected) {
int[] parent=new int[isConnected.length];
for(int i=0;i<parent.length;i++)
parent[i]=i;
for(int i=0;i<isConnected.length;i++){
for(int j=0;j<i;j++){
if(isConnected[i][j]==0)continue;
// parent[j]=i;不行哦,而且parent[i]=j也不行
join(parent,i,j);
//System.out.println(j+"的父亲是"+i);
}
}
HashSet<Integer> set=new HashSet<>();
for(int i=0;i<parent.length;i++)
find(parent,i);
for(int i=0;i<parent.length;i++)
set.add(parent[i]);
return set.size();
}
int find(int[] parent,int x) { //x是什么?是节点
int r=x;
while(r!=parent[r])
r=parent[r];
int j;
while(r!=x){
j=parent[x];
parent[x]=r;
x=j;
}
return r;
}
void join(int[] parent,int x,int y){
int a=find(parent,x);
int b=find(parent,y);
if(a!=b)
parent[b]=a;
}
}