public class UnionFindSet {
public static int inf=100000;
public static int fa[];
//基础版
public static void init(int n) {
for(int i=1;i<=n;i++) {
fa[i]=1;
}
}
public static int find(int x) {
if(fa[x]==x) {
return x;
}
else {
return find(fa[x]);
}
}
public static void merge(int i,int j) {
fa[find(i)]=find(j);
}
//路径压缩
public static int find2(int x) {
if(x==fa[x]) {
return x;
}else {
fa[x]=find(fa[x]);
return fa[x];
}
// return x == fa[x] ? x : (fa[x] = find(fa[x]));
}
//按秩合并
public static int rank[];
public static void init2(int n) {
for(int i=1;i<=n;i++) {
fa[i]=i;
rank[i]=1;
}
}
public static void merge2(int i,int j) {
int x=find(i),y=find(j);//先找到两个根节点
if(rank[x]<=rank[y]) {
fa[x]=y;
}else {
fa[y]=x;
}
if(rank[x]==rank[y]&&x!=y) {
rank[y]++;//如果深度相同且根节点不同,则新的根节点的深度+1
}
}
public static void main(String[] args) {
}
}
并查集 算法模板 Java
最新推荐文章于 2023-02-16 09:09:03 发布