所谓并查集算法,涉及到两个操作,一是寻找到祖先节点(我们可以定义数组parent[i]=i满足时,i为祖先节点),而是合并连通分支
import java.util.HashMap;
import java.util.HashSet;
public class UnionSet {
public static void main(String[] args) {
}
int []parent;
int r=0;
//寻找祖先节点
public int find(int n){
while(n!=parent[n]){
parent[n]=parent[parent[n]];
n=parent[n];
}
return n;
}
//合并两个连通分支
public void union(int u,int v){
int pu=find(u);
int pv=find(v);
if(pu==pv){
return;
}
r++;
parent[pu]=pv;
}
public int findCircleNum(int[][] M){
int n=M.length;
parent=new int [n];
//初始化祖先节点
for(int i=0;i<n;i++){
parent[i]=i;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(M[i][j]==1){
union(i,j);
}
}
}
return M.length-r;
}
}