用处:网络中节点间的连接状态,路径问题,朋友问题。
union(p,q)
isConnected(p,q)
上面代表的是数字,下面代表的是 id值,这样可以明显看到,0到4属于同一个集合,5到9属于第二个集合。因为各自的id值相等
public interface UF {
int getSize();
boolean isConnected(int p,int q);
void unionElements(int p,int q);
}
import java.util.Scanner;
public class UnionFind implements UF {
private int [] id ;//初始定义的数组
public UnionFind(int size){
id = new int[size];
for (int i=0;i=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);
}
//合并元素
@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;
}
}
}
}
class Main{
public static void main(String[] args){
Scanner sr = new Scanner(System.in);
UnionFind u = new UnionFind(4);
int a = sr.nextInt();
int b = sr.nextInt();
// int c = sr.nextInt();
u.unionElements(a,b);
System.out.println(u.find(a));
System.out.println(u.find(b));
}
}
查询这是就是log(h)h代表的深度,虽然牺牲了查询时间但是节省了合并时间
public interface UF {
int getSize();
boolean isConnected(int p, int q);
void unionElements(int p, int q);
}
public class UnionFind2 implements UF{
private int [] parent;//表示第i个元素指向那个节点
public UnionFind2(int size){
parent = new int[size];
for (int i = 0; i
加入了节点的判断 这样非常省时间:
public interface UF {
int getSize();
boolean isConnected(int p, int q);
void unionElements(int p, int q);
}
public class Main implements UF {
private int [] parent;//表示第i个元素指向那个节点
private int [] sz;//表示以sz[i]以i为根的集合中元素的个数
public Main(int size){
parent = new int[size];
sz = new int [size];
for (int i = 0; i