algs4 union-find算法的实现

import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdIn;


public class UF
{
    
    
    private int[] id;
    private int[] weight;
    private int count;

    public UF(int N)
    {
        count = N;
        id = new int[N];
        weight = new int[N];
        for(int i = 0; i < N; i++)
        {
            id[i] = i;
            weight[i] = 1;
        }

    }
    public int count()
    { return count;}

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

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

    public void union(int p, int q)
    {
        int pID = find(p);
        int qID = find(q);

        if(pID == qID)  return ;

        if(weight[pID] > weight[qID])  
        {
            id[qID] = pID;
            weight[pID] += weight[qID]; 
        }
        else
        {
            id[pID] = qID;
            weight[qID] += weight[pID];
        }

        count--;   
    }



    public static void main(String[] args)
    {
        int N = StdIn.readInt();
        UF uf = new UF(N);
        while(!StdIn.isEmpty())
        {
            int p = StdIn.readInt();
            int q = StdIn.readInt();
            if(uf.connection(p, q)) 
                continue;
            uf.union(p,q);
            StdOut.println(p + " " + q);
        }
        StdOut.println(uf.count() + "components");
    }
}

猜你喜欢

转载自blog.csdn.net/u012323667/article/details/79274074