1319. Número de operaciones conectadas a la red

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;
    }
};

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_39304630/article/details/113031693
Recomendado
Clasificación