leetcode685. Conexión redundante II / y conjunto de verificación

Asunto: 685. Conexión redundante II

En este problema, un árbol con raíces se refiere a un gráfico dirigido que cumple las siguientes condiciones. El árbol tiene un solo nodo raíz y todos los demás nodos son sucesores de este nodo raíz. Cada nodo tiene solo un nodo principal, excepto el nodo raíz, no hay ningún nodo principal.

Ingrese un gráfico dirigido que consta de un árbol con N nodos (los valores de los nodos no se repiten 1, 2,…, N) y un borde adicional. Los dos vértices del borde adicional están contenidos entre 1 y N, y este borde adicional no pertenece a un borde existente en el árbol.

El gráfico resultante es una matriz bidimensional de aristas. El elemento de cada borde es un par de [u, v], que se usa para representar el borde que conecta el vértice u y el vértice v en una gráfica dirigida, donde u es un nodo padre de v.

Devuelve un borde que se pueda eliminar, de modo que el gráfico restante sea un árbol con raíces con N nodos. Si hay varias respuestas, devuelve la última respuesta que aparece en la matriz bidimensional dada.

Ejemplo 1:

输入: [[1,2], [1,3], [2,3]]
输出: [2,3]
解释: 给定的有向图如下:
  1
 / \
v   v
2-->3

Ejemplo 2:

输入: [[1,2], [2,3], [3,4], [4,1], [1,5]]
输出: [4,1]
解释: 给定的有向图如下:
5 <- 1 -> 2
     ^    |
     |    v
     4 <- 3

Nota:

  • El tamaño de la matriz bidimensional está en el rango de 3 a 1000.
  • Cada número entero en la matriz bidimensional está entre 1 y N, donde N es el tamaño de la matriz bidimensional.

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/redundant-connection-ii 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 básica: consolidar y recolectar

Enlace de referencia: https://leetcode-cn.com/problems/redundant-connection-ii/solution/685-rong-yu-lian-jie-iibing-cha-ji-de-ying-yong-xi/
haciendo esta pregunta , Primero que nada quiero entender, bajo qué circunstancias aparecerán bordes adicionales

  • Cuando hay un anillo en el gráfico
  • Cuando hay nodos con grado 2 en el gráfico

Utilice el conjunto de búsqueda de unión para determinar si hay un anillo en el gráfico: cuando el borde no se ha agregado al conjunto de búsqueda de unión, ya tiene la misma raíz, entonces el borde es el borde que conduce a un anillo en el gráfico.

class Union{
    
    
public:
    vector<int> parent;
    vector<int> level;
    Union(){
    
    
        parent = vector<int>(1010, 0);
        level = vector<int>(1010, 0);
    }
    int find(int x){
    
    //查找当前节点的根节点
        int p = x;
        while(parent[p] != 0){
    
    
            p = parent[p];
        }
        return p;
    }
    
    void merge(int x, int y){
    
    //归并两个节点
        int px = find(x);
        int py = find(y);
        if(level[px] > level[py]){
    
    
            parent[py] = px;
        }
        else if(level[px] < level[py]){
    
    
            parent[px] = py;
        }
        else{
    
    
            parent[px] = py;
            level[py]++;
        }
    }
    
    bool same(int x, int y){
    
    //判断两个节点是否有相同的父亲
        int px = find(x);
        int py = find(y);
        return px == py;
    }
};
class Solution {
    
    
public:
    //判断能否构成一棵树
    bool isTree(vector<vector<int>>& edges, int k){
    
    
        Union U;
        for(int i = 0; i < edges.size(); ++i){
    
    
            if(i == k)
                continue;
            if(U.same(edges[i][0], edges[i][1])){
    
    
                return false;
            }
            U.merge(edges[i][0], edges[i][1]);
        }
        return true;
    }
    
    //确定删除环中的哪一条边
    vector<int> getEdges(vector<vector<int>>& edges){
    
    
        Union U;
        for(int i = 0; i < edges.size(); ++i){
    
    
            if(U.same(edges[i][0], edges[i][1])){
    
    
                return edges[i];
            }
            U.merge(edges[i][0], edges[i][1]);
        }
        return {
    
    };
    }
    
    vector<int> findRedundantDirectedConnection(vector<vector<int>>& edges) {
    
    
        //本题利用并查集的思想
        //分两种情况进行考虑
        //图中有环
        //图中没有环,但是有入度为2的点
        
        
        //统计点的入度
        int n = edges.size();
        vector<int> indegree(n + 1, 0);
        
        for(auto e : edges){
    
    
            indegree[e[1]]++;
        }
        
        vector<int> vec;
        for(int i = n - 1; i >= 0; --i){
    
    
            if(indegree[edges[i][1]] == 2){
    
    
                vec.push_back(i);
            }
        }
        
        //如果有度为2的点,判断删除后是否会构成树
        if(vec.size() > 0){
    
    
            if(isTree(edges, vec[0])){
    
    
                return edges[vec[0]];
            }
            else{
    
    
                return edges[vec[1]];
            }
        }
        
        return getEdges(edges);
    }
};

Supongo que te gusta

Origin blog.csdn.net/qq_31672701/article/details/108651921
Recomendado
Clasificación