1. //并查集模板
    2. class UF {
    3. int count;
    4. int[] size;
    5. int[] parent;
    6. public UF(int n) {
    7. this.count = n;
    8. this.size = new int[n];
    9. this.parent = new int[n];
    10. for (int i=0; i<n; i++) {
    11. parent[i] = i;
    12. size[i] = 1;
    13. }
    14. }
    15. public int find(int x) {
    16. while (parent[x] != x) {
    17. parent[x] = parent[parent[x]];
    18. x = parent[x];
    19. }
    20. return x;
    21. }
    22. public void union(int p, int q) {
    23. int rootP = find(p);
    24. int rootQ = find(q);
    25. if (rootP == rootQ) {
    26. return;
    27. }
    28. if (size[rootP] > size[rootQ]) {
    29. parent[rootQ] = rootP;
    30. size[rootP] += size[rootQ];
    31. } else {
    32. parent[rootP] = rootQ;
    33. size[rootQ] += size[rootP];
    34. }
    35. this.count--;
    36. }
    37. public boolean isConnect(int p, int q) {
    38. int rootP = find(p);
    39. int rootQ = find(q);
    40. return rootP == rootQ;
    41. }
    42. }