解法一:并查集

先判断线和结点数量的大小,线的数量小于结点数量-1则必然无法连通。
然后就是一个并查集问题,有 K 个独立的连通分支,就需要 K-1 次操作。

  1. import java.util.*;
  2. class Solution {
  3. private int[] father;
  4. public int makeConnected(int n, int[][] connections) {
  5. int lineNum = connections.length;
  6. if (lineNum < n - 1) {
  7. return -1;
  8. }
  9. init(n);
  10. for (int[] pair : connections) {
  11. union(pair[0], pair[1]);
  12. }
  13. Set<Integer> set = new HashSet<>();
  14. for (int i : father) {
  15. set.add(find(i));
  16. }
  17. return set.size() - 1;
  18. }
  19. private void init(int n) {
  20. father = new int[n];
  21. for (int i = 0; i < n; ++i) {
  22. father[i] = i;
  23. }
  24. }
  25. private void union(int x, int y) {
  26. father[x] = find(x);
  27. father[y] = find(y);
  28. father[father[x]] = father[y];
  29. }
  30. private int find(int x) {
  31. return father[x] == x ? x : find(father[x]);
  32. }
  33. }