/** * 初始化每个结点为一棵树,即每个结点的父结点指向自身 * @param n */ publicUnionFind(int n){ count = n; f = newint[n]; for (int i = 0; i < n; ++i) { f[i] = i; } }
/** * 经过一次 find 操作,该路径上所有结点的父结点变为根结点 * @param x * @return 结点 x 所在树的根结点 */ privateintfind(int x){ if (x != f[x]) { f[x] = find(f[x]); // 路径压缩到根结点 } return f[x]; }
/** * 经过一次 union 操作,树的深度不超过 3(整个操作过程中树的深度不超过 3) * @param p * @param q */ publicvoidunion(int p, int q){ int i = find(p); int j = find(q); if (i != j) { f[i] = j; --count; } }
/** * * @param p * @param q * @return p 与 q 是否连通 */ publicbooleanconnected(int p, int q){ return find(p) == find(q); }