Leetcode Leetcode 684. Conexión redundante (python)

Tema:

En este problema, el árbol se refiere a un gráfico conectado y acíclico no dirigido.
Ingrese un gráfico 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. Este borde adicional no pertenece a un borde existente en el árbol.
El gráfico resultante es una matriz bidimensional de aristas. Los elementos de cada borde son un par de [u, v], que satisfacen u <v, que representan los bordes del gráfico no dirigido que conecta los vértices u y v.
Devuelve un borde que se puede eliminar para que el gráfico resultante sea un árbol con N nodos. Si hay varias respuestas, se devuelve el último borde de la matriz bidimensional. El lado de la respuesta [u, v] debe satisfacer el mismo formato u <v.

Ejemplo 1:

Entrada: [[1,2], [1,3], [2,3]]
Salida: [2,3]
Explicación: El gráfico no dirigido dado es:

	  1
	 / \
	2 - 3

Ejemplo_2:

Entrada: [[1,2], [2,3], [3,4], [1,4], [1,5]]
Salida: [1,4]
Explicación: El gráfico no dirigido dado es:

5 - 1 - 2
| |
4 - 3

Solución:

Esta plantilla de pregunta proviene de la plantilla de verificación de combinación

Esta pregunta es una pregunta similar que es el problema más básico para juzgar si existe un anillo. El
árbol es un gráfico conectado y acíclico no dirigido.
Después de agregar un borde adicional al árbol, aparecerá un anillo.
Por lo tanto, el borde adicional es el anillo resultante. Borde emergente

Podemos
juzgar dos nodos cada vez que se agrega una nueva ventaja :

Si dos nodos no están conectados cuando no se agregan bordes (los
nodos raíz son diferentes), significa que los dos nodos pertenecen a diferentes componentes conectados.
Si la fusión no forma un anillo, conecte los dos nodos (fusionar)

Si los dos nodos ya están
conectados cuando no se agrega ningún borde (el nodo raíz es el mismo), significa que los dos nodos pertenecen al mismo componente conectado.
Si se combinan, formarán un anillo, simplemente regrese a este borde .

Finalmente, si el bucle no se forma después de todo el recorrido,
devuelve una lista vacía

Código:

class UnionFind:
    def __init__(self):
        """
        记录每个节点的父节点
        """
        self.father = {
    
    }
    
    def find(self,x):
        """
        查找根节点
        路径压缩
        """
        root = x

        while self.father[root] != None:
            root = self.father[root]
         
        return root
    
    def merge(self,x,y):
        """
        合并两个节点
        """
        root_x,root_y = self.find(x),self.find(y)
        
        if root_x != root_y:
            self.father[root_x] = root_y

    def is_connected(self,x,y):
        """
        判断两节点是否相连
        """
        return self.find(x) == self.find(y)

    def add(self,x):
        """
        添加新节点
        """
        if x not in self.father:
            self.father[x] = None


class Solution:
    def findRedundantConnection(self, edges: List[List[int]]) -> List[int]:
        uf = UnionFind()
        for i in range(1, len(edges) + 1):
            uf.add(i)

        for node1, node2 in edges:
            if uf.is_connected(node1, node2) is False:
                uf.merge(node1, node2)
            else:
                return [node1, node2]

        return []

Resultado:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_50791900/article/details/112727790
Recomendado
Clasificación