并查集具有动态连通性,它可以理解成“p和q是相连的",具有自反性,对称性,传递性。
比如:怎么才可以查到一个陌生人是否和这个家族有血源关系等问题。
union-find 算法的API
UF(int N);void union(int p,int q) ;int find(int p) ;boolean connected(int p,int q) ; int count() ;
下面我用JAVA写一段并查集的代码:
public static class UF {
private int[] id;//分量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=find(p);
int qID=find(q);
//如果q和p已经在同一个分量中
if(pID==qID) return;
for(int i=0;i<id.length;i++){
if(id[i]==pID) id[i]=qID;
count--;
}
}
}