Java 并查集Union Find

对于一组数据,主要支持两种动作:

union

isConnected

public interface UF {
	int getSize();
    boolean isConnected(int p,int q);
    void unionElements(int p,int q);  
}

  

public class UnionFind1 implements UF{
	private int[] id;
	public UnionFind1(int size){
		id=new int[size];
		for (int i = 0; i < id.length; i++) {
		     id[i]=i;
		}
	}
	@Override
	public int getSize(){
		return id.length;
	}
	//查找元素p所对应的集合编号
	private int find(int p) {
		if(p<0&&p>id.length)
			throw new IllegalArgumentException("p is out of bound.");
		return id[p];
	}
	//查看元素p和元素q是否所属一个集合
	@Override
	public boolean isConnected(int p,int q){
		return find(p)==find(q);
	}
	//合并元素p和元素q所属的集合
	@Override
	public void  unionElements(int p,int q){
		int pID=find(p);
		int qID=find(q);
		if(pID==qID)
			return;
		for (int i = 0; i < id.length; i++) {
			if(id[i]==pID)
				id[i]=qID;
		}
	}

}

  

猜你喜欢

转载自www.cnblogs.com/sunliyuan/p/10746822.html