• 【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);
            
        } 
    }


  • 相关阅读:
    框架学习之Struts2 第五节 自定义拦截器
    框架学习之Struts2 第四节 文件上传
    2011_7_23 第三次评审
    框架学习之Struts2 第二节 Action的详解
    框架学习之Struts2 第一节 开发环境的搭建和第一个应用开发
    框架学习之Struts2 第七节 国际化
    关于LookUp的总结
    UML自学手册___事务模式——事务与人、地、物
    css合并外边距详解
    开发中的函数相关
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7228552.html
Copyright © 2020-2023  润新知