Utilice cables Ethernet para conectar n computadoras a una red, y los números de las computadoras van del 0 al n-1. Los cables están representados por conexiones, donde las conexiones [i] = [a, b] conectan las computadoras ay b.
Cualquier computadora en la red puede acceder directa o indirectamente a cualquier otra computadora en la misma red a través de la red.
Para darle las conexiones de cableado iniciales de esta red de computadoras, puede desconectar el cable entre dos computadoras conectadas directamente y usarlo para conectar un par de computadoras que no están conectadas directamente. Calcule y devuelva el número mínimo de operaciones necesarias para conectar todas las computadoras. Si no es posible, se devuelve -1.
Ejemplo 1:
Entrada: n = 4, conexiones = [[0,1], [0,2], [1,2]]
Salida: 1
Explicación: Desenchufe el cable entre las computadoras 1 y 2, y conéctelo a las computadoras 1 y 3 en.
Ejemplo 2:
Entrada: n = 6, conexiones = [[0,1], [0,2], [0,3], [1,2], [1,3]]
Salida: 2
Ejemplo 3:
Entrada: n = 6, conexiones = [[0,1], [0,2], [0,3], [1,2]]
Salida: -1
Explicación: El número de cables es insuficiente.
Ejemplo 4:
Entrada: n = 5, conexiones = [[0,1], [0,2], [3,4], [2,3]]
Salida: 0
rápido:
1 <= n <= 10 ^ 5
1 <= connections.length <= min (n * (n-1) / 2, 10 ^ 5)
conexiones [i] .length == 2
0 <= conexiones [i] [ 0], conexiones [i] [1] <n
conexiones [i] [0]! = Conexiones [i] [1]
No hay conexiones duplicadas.
Dos computadoras no estarán conectadas por varios cables.
Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/number-of-operations-to-make-network-connected Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.
Idea: Esta plantilla de conjunto de preguntas es suficiente. Lo escribí yo mismo, pero realmente no entendí la solución. Siento que su matriz de tamaño no está disponible.
class Solution {
public int makeConnected(int n, int[][] connections) {
if (connections.length < n - 1) {
return -1;
}
UnionFind uf = new UnionFind(n);
for (int[] conn : connections) {
uf.union(conn[0], conn[1]);
}
return uf.Count - 1;
}
}
// 并查集模板
class UnionFind {
int[] parent;
//int[] size;
int n;
// 当前连通分量数目
int Count;
public UnionFind(int n) {
this.n = n;
this.Count = n;
this.parent = new int[n];
//this.size = new int[n];
//Arrays.fill(size, 1);
for (int i = 0; i < n; ++i) {
parent[i] = i;
}
}
public int find(int x) {
if(parent[x]!=x)
{
parent[x] = find(parent[x]);
}
return parent[x];
}
public boolean union(int x, int y) {
x = find(x);
y = find(y);
if (x == y) {
return false;
}
//if (size[x] < size[y]) {
// int temp = x;
// x = y;
// y = temp;
//}
parent[x] = y;
//size[x] += size[y];
--Count;
return true;
}
public boolean connected(int x, int y) {
x = find(x);
y = find(y);
return x == y;
}
}