该作者已经将并查集原理讲述的非常清楚 传送门:博客地址
并查集实现代码
使用了路径压索和连接优化
package com.algorithm.unionFind;
public class UnionFind {
private int [] group, groupSize;
private int groupNum;
/**
* 初始化
* @param num
*/
UnionFind(int num){
group = new int[num];
groupSize = new int[num];
groupNum = num;
for(int i = 0;i<num;i++){
group[i] = i;
groupSize[i] = 1;
}
}
/**
*
* 查询节点node属于的组
* @param node
* @return
*/
public int find(int node){
while(node != group[node]){
group[node] = group[group[node]];
node = group[node];
}
return node;
}
/**
* 连接两个节点nodePre,nodePost,使之属于同一个组
* @param nodePre
* @param nodePost
* @return
*/
public void union(int nodePre, int nodePost){
int nodePreRoot = find(nodePre);
int nodePostRoot = find(nodePost);
if(nodePostRoot == nodePreRoot) return ;
if(groupSize[nodePostRoot] > groupSize[nodePreRoot]) {
group[nodePreRoot] = nodePostRoot;
groupSize[nodePostRoot] += groupSize[nodePreRoot];
}
else{
group[nodePostRoot ] = nodePreRoot;
groupSize[nodePreRoot] += groupSize[nodePostRoot];
}
groupNum -- ;
}
/**
* 判断两个节点之间是否是联通的
* @param nodePre
* @param nodePost
* @return
*/
public boolean isConnected(int nodePre, int nodePost){
return find(nodePre) == find(nodePost);
}
/**
* 获取组的数目
* @return
*/
public int getCount(){
return groupNum;
}
}