zoukankan      html  css  js  c++  java
  • 【Union Find】JAVA implementation



    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Scanner;
    
    class UF
    {
    	private int[] id;
    	private int count;
    	
    	public UF(int N)
    	{
    		count = N;
    		id = new int[N];
    		for (int i = 0; i < N; i++) {
    			id[i] = i;
    		}
    	}
    	public int count(){
    		return count;
    	}
    	public int find(int p){
    		while (p != id[p]) {
    			p = id[p];
    		}
    		return p;
    	}
    	public boolean connected(int p, int q){
    		return find(p) == find(q);
    	}
    	public void union(int p, int q){
    		int proot = find(p);
    		int qroot = find(q);
    		
    		if (proot == qroot) {
    			return;
    		}
    		id[proot] = qroot;
    		count--;
    	}
    	public String toString()
    	{
    		return Arrays.toString(id);
    	}
    }
    
    public class Main {
        
        public static void main(String[] args) 
        {
            Scanner jin = new Scanner(System.in);
            int N = jin.nextInt();
            UF uf = new UF(N);
            while (jin.hasNext()) {
    			int p = jin.nextInt();
    			int q = jin.nextInt();
    			if (uf.connected(p, q)) {
    				continue;
    			}
    			uf.union(p, q);
    		}
            System.out.println(uf.count());
            
            System.out.println(uf);
            
        } 
    }

    对两棵树的合并操作做优化。引入变量size表示这棵树的结点个数,合并时。总是使size小的链接到size大的树。这样合并得到的森林。假设有N个结点。那么树的深度

    不会超过lgN。

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Scanner;
    
    class UF
    {
    	private int[] id;
    	private int[] size;
    	private int count;
    	
    	public UF(int N)
    	{
    		count = N;
    		id = new int[N];
    		size = new int[N];
    		for (int i = 0; i < N; i++) {
    			id[i] = i; size[i] = 1;
    		}
    	}
    	public int count(){
    		return count;
    	}
    	public int find(int p){
    		while (p != id[p]) {
    			p = id[p];
    		}
    		return p;
    	}
    	public boolean connected(int p, int q){
    		return find(p) == find(q);
    	}
    	public void union(int p, int q){
    		int proot = find(p);
    		int qroot = find(q);
    		
    		if (proot == qroot) {
    			return;
    		}
    		if (size[proot] < size[qroot]) { id[proot] = qroot; size[qroot] += size[proot];}
    		else {id[qroot] = proot; size[proot] += size[qroot];}
    		count--;
    	}
    	public String toString()
    	{
    		return Arrays.toString(id);
    	}
    }
    
    public class Main {
        
        public static void main(String[] args) 
        {
            Long n;
            //System.out.println(Long.MAX_VALUE);
            Scanner jin = new Scanner(System.in);
            int N = jin.nextInt();
            UF uf = new UF(N);
            while (jin.hasNext()) {
    			int p = jin.nextInt();
    			int q = jin.nextInt();
    			if (uf.connected(p, q)) {
    				continue;
    			}
    			uf.union(p, q);
    		}
            System.out.println(uf.count());
            
            System.out.println(uf);
            
        } 
    }


  • 相关阅读:
    链表--判断一个链表是否为回文结构
    矩阵--“之”字形打印矩阵
    二叉树——平衡二叉树,二叉搜索树,完全二叉树
    链表--反转单向和双向链表
    codeforces 490C. Hacking Cypher 解题报告
    codeforces 490B.Queue 解题报告
    BestCoder19 1001.Alexandra and Prime Numbers(hdu 5108) 解题报告
    codeforces 488A. Giga Tower 解题报告
    codeforces 489C.Given Length and Sum of Digits... 解题报告
    codeforces 489B. BerSU Ball 解题报告
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7228552.html
Copyright © 2011-2022 走看看