注意理解路径压缩
static class UnionFind {int[] fa;public UnionFind(int n) {fa = new int[n];for (int i = 0; i < n; i++) {fa[i] = i;}}public int find(int i) {if (fa[i] != i) {fa[i] = find(fa[i]);}return fa[i];}public void union(int i, int j) {int fai = find(i);int faj = find(j);if (fai != faj) {fa[fai] = faj;}}}