コード
public class ChristmasTreeDecoration { public int solve(int[] col, int[] x, int[] y) { int N = col.length; UnionFind uf = new UnionFind(N); for (int i = 0; i < y.length; i++) { if (col[x[i] - 1] != col[y[i] - 1]) { uf.unite(x[i] - 1, y[i] - 1); } } int groups = 1; for (int i = 0; i < N; i++) { if (!uf.isSame(0, i)) { groups++; uf.unite(0, i); } } return groups - 1; } class UnionFind { int[] parts; UnionFind(int n) { parts = new int[n]; for (int i = 0; i < n; i++) parts[i] = i; } public int find(int x) { if (parts[x] == x) return x; return parts[x] = find(parts[x]); } public Boolean isSame(int x, int y) { return find(x) == find(y); } public void unite(int x, int y) { if (find(x) == find(y)) return; parts[find(x)] = find(y); } } }