Java实现并查集,合并时采用路径压缩算法。
如果合并时使用循环修改的方法,一次合并的时间复杂度就为N,无法接受
public class Union { public int[] id;//对应索引所在的集 public int[] sz;//所在集的size,合并时小集合大集 public int count; public Union(int N){ id = new int[N]; for(int i=0;i<id.length;i++){ id[i] = i; } }//初始化,每个节点的集都对应自己 public boolean connected(int p,int q){ return id[p] == id[q]; } public int root(int i){ //找到节点所在的集 while(i!=id[i]){ id[i] = id[id[i]]; i = id[i]; } return id[i]; /* 递归的路径压缩算法 if(i!=id[i]){ id[i] = root(id[i]); } return id[i]; */ } public void union(int p,int q){ int i = root(p); int j = root(q); //root使每个值都找到自己的集合 if(i==j){ return ; } if(sz[i]<sz[j]){ id[i] = j; sz[j] += sz[i]; }else{ id[j] = i; sz[i] += sz[j]; } count-- ; } }
原文地址:https://www.cnblogs.com/sh1296/p/10326246.html
时间: 2024-10-12 04:15:46