1319. Número de operaciones conectadas a la red
Enlace: https://leetcode-cn.com/problems/number-of-operations-to-make-network-connected/
n
Conecte las computadoras a una red con un cable Ethernet y los números de computadora son del 0
a n-1
. El cable se utiliza para connections
indicar que connections[i] = [a, b]
la computadora a
y el 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 el cableado inicial de esta red de computadoras connections
, 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:
输入:n = 4, connections = [[0,1],[0,2],[1,2]]
输出:1
解释:拔下计算机 1 和 2 之间的线缆,并将它插到计算机 1 和 3 上。
Ejemplo 2:
输入:n = 6, connections = [[0,1],[0,2],[0,3],[1,2],[1,3]]
输出:2
Ejemplo 3:
输入:n = 6, connections = [[0,1],[0,2],[0,3],[1,2]]
输出:-1
解释:线缆数量不足。
Ejemplo 4:
输入:n = 5, connections = [[0,1],[0,2],[3,4],[2,3]]
输出:0
rápido:
1 <= n <= 10^5
1 <= connections.length <= min(n*(n-1)/2, 10^5)
connections[i].length == 2
0 <= connections[i][0], connections[i][1] < n
connections[i][0] != connections[i][1]
- No hay conexiones duplicadas.
- Dos computadoras no estarán conectadas por varios cables.
Idea: n puntos quieren estar conectados entre sí, y el borde mínimo es n-1, que forma una estructura de árbol. En esta pregunta, si tratamos cada componente conectado como un punto y suponemos que hay x componentes conectados en el gráfico, entonces solo se necesitan bordes x-1. Podemos encontrar el número de aristas redundantes en cada componente conectado mediante la búsqueda de unión.
class Solution {
public:
int Father[100010];
unordered_set<int> Root;
int Find(int x){
return x == Father[x] ? x : Father[x] = Find(Father[x]);
}
bool Union(int A,int B){
A = Find(A);
B = Find(B);
if(A != B){
Father[A] = B;
Root.erase(A);
return true;
}
return false;
}
int makeConnected(int n, vector<vector<int>>& connections) {
int m = connections.size(), i, reseEdges = 0;
if(m < n - 1) return -1; // 最少需要的边数 == n - 1
for(i = 0; i < n; ++ i){
Father[i] = i;
Root.insert(i);
}
for(i = 0; i < m; ++ i){
if(!Union(connections[i][0],connections[i][1])){
++ reseEdges;
}
}
return reseEdges >= Root.size() - 1 ? Root.size() - 1 : -1;
}
};