并查集的Java实现
Posted sh1296
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集的Java实现相关的知识,希望对你有一定的参考价值。
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-- ; } }
以上是关于并查集的Java实现的主要内容,如果未能解决你的问题,请参考以下文章