並查集作用:
1.判斷兩節點是否聯通
2.連接兩個節點,使之聯通
並查集數據結構:
多路樹結構
例:
存儲結構:
數組模擬:設數組爲pre[i]
i爲當前節點,pre[i]則爲i節點所指向的父節點
那麼判斷兩個節點是否聯通就可以判斷兩節點的最終指向的父節點是否一樣。
聯通兩個並查集,也變得很簡單,兩個並查集的最終父節點肯定是不同的,那麼連接兩個並查集就可以只要將其中一個並查集的最終父節點指向另一個並查集的父節點。
最終代碼如下:
package 並查集;
import java.util.Scanner;
public class Main {
public static final int NUMBER = 1000;
//pre代表,此下標 i 的父節點下標爲 pre[i]
static int pre[] = new int[NUMBER+5];
//初始化父節點爲自己本身
public static void initPre(){
for(int i=0;i<=NUMBER;++i)
pre[i]=i;
}
//找出最大父節點,並更新節點
public static int findSet(int x){
int p = x;
while(pre[p]!=p) p=pre[p];
//此時找出的p就是x的最大父節點
int r;
//更新x的父節點
while(x!=p){
r = pre[x];
pre[x] = p;
x = r;
}
return p;
}
//判斷是否是在一個並查集上
public static boolean isSameSet(int x,int y){
int fx = findSet(x);
int fy = findSet(y);
return fx==fy ? true:false;
}
//連接兩個並查集
public static void unionSet(int x,int y){
int fx = findSet(x);
int fy = findSet(y);
//連接兩個並查集
if(fx!=fy){
pre[fy]=fx;
}
}
public static void main(String[] args) {
}
}