码迷,mamicode.com
首页 > 其他好文 > 详细

并查集

时间:2016-10-02 19:27:18      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

1、quick-find 算法

import java.util.Scanner ;

public 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 boolean connected(int p, int q){
		return find(p) == find(q) ;
	}

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

	public void union(int p, int q){
		int pID = id[p] ;
		int qID = id[q] ;
		if (pID == qID) {
			return ;
		}else{
			for (int i=0;i<id.length;i++) {
				if(id[i]==pID){
					id[i] = qID ;
				}
			}
			count-- ;
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in) ;
		System.out.println("please input the number of nodes:") ;
		int N = sc.nextInt() ;
		UF uf = new UF(N) ;
		System.out.println("please input the number of relateon of nodes:") ;
		int m = sc.nextInt() ;
		for(int i=0;i<m;i++){
			int p = sc.nextInt() ;
			int q = sc.nextInt() ;
			if(uf.connected(p,q)){
				continue ;
			}else{
				uf.union(p,q) ;
				//System.out.println(p + " " + q) ;
			}
		}
		System.out.println(uf.count() + " components.") ;
	}
}

  

2、quick-union 算法

 

import java.util.Scanner ;

public class UF02{
	private int[] id ;
	private int count ;

	public UF02(int N){
		count = N ;
		id = new int[N] ;
		for (int i=0;i<N;i++) {
			id[i] = i ;
		}
	}
	
	public int count(){
		return count ;
	}

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

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

	public void union02(int p, int q){
		int pRoot = find02(p) ;
		int qRoot = find02(q) ;

		if (pRoot == qRoot) {
			return ;
		}else{
			id[pRoot] = qRoot ;
			count-- ;
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in) ;
		System.out.println("please input the number of nodes:") ;
		int N = sc.nextInt() ;
		UF02 uf = new UF02(N) ;
		System.out.println("please input the number of relateon of nodes:") ;
		int m = sc.nextInt() ;
		for(int i=0;i<m;i++){
			int p = sc.nextInt() ;
			int q = sc.nextInt() ;
			if(uf.connected(p,q)){
				continue ;
			}else{
				uf.union02(p,q) ;
				//System.out.println(p + " " + q) ;
			}
		}
		System.out.println(uf.count() + " components.") ;
	}
}

  

3、加权 quick-union 算法

 

import java.util.Scanner ;

public class UF03{
	private int[] id ;
	private int[] sz ;
	private int count ;

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

	}
	
	public int count(){
		return count ;
	}

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

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

	public void union03(int p, int q){
		int pRoot = find03(p) ;
		int qRoot = find03(q) ;

		if (pRoot == qRoot) {
			return ;
		}else{
			if (sz[pRoot]<sz[qRoot]) {
				id[pRoot] = qRoot ;
				sz[qRoot] += sz[pRoot] ; 
			}else{
				id[qRoot] = pRoot ;
				sz[pRoot] += sz[qRoot] ;
			}
			count-- ;
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in) ;
		System.out.println("please input the number of nodes:") ;
		int N = sc.nextInt() ;
		UF03 uf = new UF03(N) ;
		System.out.println("please input the number of relateon of nodes:") ;
		int m = sc.nextInt() ;
		for(int i=0;i<m;i++){
			int p = sc.nextInt() ;
			int q = sc.nextInt() ;
			if(uf.connected(p,q)){
				continue ;
			}else{
				uf.union03(p,q) ;
				//System.out.println(p + " " + q) ;
			}
		}
		System.out.println(uf.count() + " components.") ;
	}
}

  

 

并查集

标签:

原文地址:http://www.cnblogs.com/lshl/p/5927803.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!