算法:quick-union实现连通分量的合并

具体思路为:
1、定义一个数组,初始化每个元素为一个连通分量。
2、数组元素对应的下标值是他的父节点的下标,因此实现了像树一样的层层链接,一直到根节点(根节点的下标值等于下标)
3、find()函数实现了获取根节点下标的功能,我们通过比较根节点的大小,将小树合并到大树上来,最终减少连通分量为1,即合并成了一棵树
4、connected用来判断两个元素是否连通,也就是看看他们的根节点是否相同
5、union实现了具体的合并操作

import java.util.Arrays;
import java.util.Scanner;


public class QuickUnion {

    private int[] id;
    private int[] sz;

    public QuickUnion(int N) {
        id = new int[N];
        sz = new int[N];
        for (int i = 0; i < N; i++) {
            id[i] = i;
            sz[i] = 1;
        }
    }

    public boolean connected(int p,int q){
        return find(q)==find(p);
    }

    public int find(int q){
        while (q!=id[q]){
            q = id[q];
        }
        return q;
    }

    public void union(int p,int q){
        int pID = find(p);
        int qID = find(q);
        if(pID==qID) {
            return;
        }
        if(sz[pID]>sz[qID]){
            id[qID] = pID;
            sz[pID] += sz[qID];
        }
        else {
            id[pID] = qID;
            sz[qID] += sz[pID];
        }
    }

    public static void main(String[] args) {
        int N = 10;
        QuickUnion quickUnion = new QuickUnion(N);
        System.out.println("before:");
        System.out.println(Arrays.toString(quickUnion.id));
        System.out.println(Arrays.toString(quickUnion.sz));
        quickUnion.union(2,3);
        quickUnion.union(1,7);
        quickUnion.union(9,6);
        quickUnion.union(1,3);
        System.out.println("after:");
        System.out.println(Arrays.toString(quickUnion.id));
        System.out.println(Arrays.toString(quickUnion.sz));
    }
}

你可能感兴趣的:(算法:quick-union实现连通分量的合并)