转载参考:http://www.cnblogs.com/noKing/p/8018609.html
参考代码:
public class UnionFind {
int size;
int[] unionset;
int[] weight;
public UnionFind(int size){
this.size = size;
unionset = new int[size];
weight = new int[size];
for (int i=0;i<size;i++){
unionset[i]=i;
weight[i] = 1;
}
}
public int find(int element){
if (element==unionset[element]){return element;}
else {
int root = find(unionset[element]);
unionset[element]=root;//将element的父节点设置为查找到的根结点,缩短路径
return root;
}
// while (element!=unionset[element]){//当element有自己的父亲结点时
// unionset[element]=unionset[unionset[element]];//将element中的值设置为其父节点的父节点,缩短路径
// element = unionset[element];
// }
// return element;
}
public boolean isConnected(int firstelement,int secondelement){return find(firstelement)==find(secondelement);}
public void unionElements(int firstelement,int secondelement){
int firstroot = find(firstelement);
int secondroot = find(secondelement);
if (firstroot!=secondroot){
if (weight[firstroot]>weight[secondroot]){unionset[secondroot]=firstroot;weight[firstroot]+=weight[secondroot];}
else {unionset[firstroot]=secondroot;weight[secondroot]+=weight[firstroot];}
}
}
private void printArr(int[] intlist) {
for (int id : intlist) {
System.out.print(id + "\t");
}
System.out.println();
}
public static void main(String[] args){
UnionFind union = new UnionFind(10);
System.out.println("初始parent:");
union.printArr(union.unionset);
System.out.println("初始height:");
union.printArr(union.weight);
System.out.println("连接了5 6 之后的parent:");
union.unionElements(5, 6);
union.printArr(union.unionset);
System.out.println("连接了5 6 之后的weight:");
union.printArr(union.weight);
System.out.println("连接了1 2 之后的parent:");
union.unionElements(1, 2);
union.printArr(union.unionset);
System.out.println("连接了1 2 之后的weight:");
union.printArr(union.weight);
System.out.println("连接了2 3 之后的parent:");
union.unionElements(2, 3);
union.printArr(union.unionset);
System.out.println("连接了2 3 之后的weight:");
union.printArr(union.weight);
System.out.println("连接了1 4 之后的parent:");
union.unionElements(1, 4);
union.printArr(union.unionset);
System.out.println("连接了1 4 之后的weight:");
union.printArr(union.weight);
System.out.println("连接了1 5 之后的parent:");
union.unionElements(1, 5);
union.printArr(union.unionset);
System.out.println("连接了1 5 之后的weight:");
union.printArr(union.weight);
System.out.println("连接了5 8 之后的parent:");
union.unionElements(5, 8);
union.printArr(union.unionset);
System.out.println("连接了5 8 之后的weight:");
union.printArr(union.weight);
System.out.println("连接了8 9 之后的parent:");
union.unionElements(8, 9);
union.printArr(union.unionset);
System.out.println("连接了8 9 之后的weight:");
union.printArr(union.weight);
System.out.println("1 6 是否连接:" + union.isConnected(1, 6));
System.out.println("5 9 是否连接:" + union.isConnected(1, 8));
}
}