并查集是一种用来合并不相交的集合的数据结构。
(在此记录下来以便自己复习)
public class 并查集 {
static int n;
static int[] parent; //保存每个点的父结点
static int[][] edge; //表示每个点之间的关系
static int[] rank; //表示树的层数
//找祖宗结点(根结点)
public static int find(int x) {
if(parent[x]!=x)
parent[x]=find(parent[x]);
return parent[x];
}
//合并
public static void merge(int x,int y) {
x=find(x);
y=find(y);
if(x!=y)
if(rank[x]>rank[y])
parent[y]=x;
else if(rank[x]<rank[y]) //路径优化
parent[x]=y;
else {
parent[x]=y;
rank[y]++;
}
}
public static void main(String[] args) {
parent=new int[7];
edge=new int[7][7];
rank=new int[7];
//初始化
for(int i=1;i<=6;i++) {
parent[i]=i; //表示i的父结点是i
rank[i]=0;
}
edge[1][2]=1;
edge[1][3]=1;
edge[1][5]=1;
edge[3][4]=1;
edge[5][2]=1;
for(int i=1;i<=6;i++)
for(int j=1;j<=6;j++)
if(edge[i][j]==1)
merge(i,j);
}
}