Comprobar si un borde forma parte de un árbol de expansión mínimo

Dado un gráfico ponderado no dirigido conectado en forma de array 2D donde cada fila es del tipo [Node inicial, Node final, peso] que describe un borde, y también dos números enteros (A, B) . Devuelve si el borde formado entre (A, B) es parte de cualquiera de los árboles de expansión mínimos (MST) del gráfico.

Árbol de expansión mínimo (MST): este es un subgráfico especial del gráfico, de modo que todos y cada uno de los vértices están conectados y la suma total de los pesos de los bordes de este subgráfico es la mínima posible. Un gráfico puede tener varios árboles de expansión mínimos.

Ejemplos:

Entrada: gráfico = [[0 ,1, 20] , [0 , 2 , 5] , [ 0, 3, 10 ] , [ 2, 3, 10]], A = 2, B = 3 Salida
: Verdadero
Explicación : Se pueden generar 2 árboles de expansión mínimos que tendrán un peso de 35. Las conexiones de los árboles son 
1: [(0,1) , (0,3) , (0,2)] => 20 + 10 + 5 = 35
2do: [ ( 0 , 1) , ( 0 , 2 ) , ( 2 , 3) ​​] => 20 + 5 + 10 = 35 Como puede
verse, la arista (2, 3) está presente en el segundo MST.

El gráfico se muestra en la imagen:

Entrada : gráfico = [[0 ,1, 20] , [0 , 2 , 5] , [ 0, 3, 10 ] , [ 2, 3, 20]], A = 2, B = 3 Salida
: Falso
Explicación : Solo se puede generar 1 árbol de expansión mínimo con un peso de 35,
pero el borde (2, 3) no está incluido.
[(0,1) , (0,3) , (0,2)] => 20 + 10 + 5 = 35

El gráfico se da en la imagen.

 

Enfoque : el algoritmo de Kruskal y el algoritmo de Prim son los dos algoritmos más utilizados que se pueden usar para encontrar el MST de cualquier gráfico. En este artículo, la solución se basa en el algoritmo de Kruskal. Siga los pasos que se mencionan a continuación para resolver el problema utilizando este enfoque:

  1. Encuentre el costo mínimo del árbol de expansión de todo el gráfico, utilizando el algoritmo de Kruskal .
  2. A medida que se verifica la inclusión del borde (A, B) en el MST, incluya este borde primero en el árbol de expansión mínimo y luego incluya otros bordes posteriormente.
  3. Finalmente, verifique si el costo es el mismo para ambos árboles de expansión, incluido el borde (A, B) y el peso calculado del MST.
  4. Si el costo es el mismo , entonces el borde (A, B) es parte de algún MST del gráfico; de lo contrario, no lo es.

A continuación se muestra la implementación del enfoque anterior: 

Python3

# Python program to implement above approach
  
# Class to implement disjoint set union
class dsu:
    def __init__(self):
        self.parent = {}
        self.rank = {}
  
    # Function to find parent of a node
    def find(self, x):
        if (x not in self.parent):
            self.rank[x] = 1
            self.parent[x] = x
        if (self.parent[x] != x):
            self.parent[x] = \
                self.find(self.parent[x])
        return (self.parent[x])
  
    # Function to perform union
    def union(self, u, v):
        p1 = self.find(u)
        p2 = self.find(v)
  
        # If do not belong to same set
        if (p1 != p2):
            if (self.rank[p1]
                    < self.rank[p2]):
                self.parent[p1] = p2
  
            elif(self.rank[p1]
                 > self.rank[p1]):
                self.parent[p2] = p1
            else:
                self.parent[p2] = p1
                self.rank[p1] += 1
            return (True)
  
        # Belong to same set
        else:
            return False
  
  
class Solution:
  
    # Find the MST weight
    def kruskal(self, include, edges, a, b):
        obj = dsu()
        total = 0
  
        # If include is True , then include
        # edge (a,b) first
        if (include):
            for (u, v, wt) in edges:
  
                # As graph is undirected so
                # (a,b) or (b,a) is same
                # If found break the for loop
                if (u, v) == (a, b) or \
                        (b, a) == (u, v):
                    val = obj.union(a, b)
                    total += wt
                    break
  
        # Go on adding edge to the disjoint set
        for (u, v, wt) in edges:
  
            # Nodes (u,v) not belong to
            # same set include it
            if (obj.union(u, v)):
                total += wt
  
        # Finally return total weight of MST
        return (total)
  
    # Function to find if edge (a, b)
    # is part of any MST
    def solve(self, edges, a, b):
  
        # Sort edges according to weight
        # in ascending order
        edges.sort(key=lambda it: it[2])
  
        # Not included edge (a,b)
        overall = self.kruskal(False,
                               edges, a, b)
  
        # Find mst with edge (a,b) included
        inc = self.kruskal(True,
                           edges, a, b)
  
        # Finally return True if same
        # else False
        if (inc == overall):
            return (True)
        else:
            return (False)
  
  
# Driver code
if __name__ == "__main__":
    obj = Solution()
    graph = [[0, 1, 20], [0, 2, 5],
             [0, 3, 10], [2, 3, 10]]
    A, B = 2, 3
    val = obj.solve(graph, A, B)
    if (val):
        print("True")
    else:
        print("False")
Producción

True

Complejidad del Tiempo : O(E * logV). donde E es el número de aristas y V es el número de vértices.
Espacio Auxiliar : O(V)

Publicación traducida automáticamente

Artículo escrito por chantya17 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *