GuilinDev

Lc1319

05 August 2008

1319. Number of Operations to Make Network Connected

有 n 台计算机,编号从 0 到 n - 1,通过以太网电缆连接形成一个网络,其中 connections[i] = [ai, bi] 表示计算机 ai 和 bi 之间的连接。任何计算机都可以通过网络直接或间接访问任何其他计算机。

您将获得初始计算机网络连接。您可以在两台直接连接的计算机之间提取某些电缆,并将它们放置在任何一对断开连接的计算机之间以使它们直接连接。

返回为使所有计算机连接所需执行此操作的最少次数。如果不可能,则返回-1。

Union Find

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
    public int makeConnected(int n, int[][] connections) {
        if (connections.length < n - 1)
            return -1;
        int[] parent = new int[n];
        int count = 0;
        for (int i = 0; i < n; i++)
            parent[i] = i;
        for (int[] connection : connections) {
            Union(parent, connection[0], connection[1]);
        }

        for (int i = 0; i < n; i++) {
            if (parent[i] == i)
                count++;
        }
        return count - 1;
    }

    public static int find(int[] parent, int i) {
        if (parent[i] == i) return i;
        return find(parent, parent[i]);
    }

    public static void Union(int[] parent, int x, int y) {
        int xset = find(parent, x);
        int yset = find(parent, y);
        parent[xset] = yset;
    }
}