es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo convertir un árbol de expansión mínimo a una lista de índices utilizando scipy?

Si tengo los siguientes gráficos de entrada y salida:

Gráfico de entrada árbol de expansión mínimo

 (0)                         (0)
/   \                       /

3 8 3
/ \ /
(3)—5—(1) (3)—5—(1)
\ / /
6 2 2
\ / /
(2) (2)

… creados usando scipy.sparse.csgraph.minimum_spanning_tree:

from scipy.sparse import csr_matrix
from scipy.sparse.csgraph import minimum_spanning_tree
X = csr_matrix([[0, 8, 0, 3],
… [0, 0, 2, 5],
… [0, 0, 0, 6],
… [0, 0, 0, 0]])
Tcsr = minimum_spanning_tree(X)
Tcsr.toarray().astype(int)
array([[0, 0, 0, 3],
[0, 0, 2, 5],
[0, 0, 0, 0],
[0, 0, 0, 0]])

¿Cómo puedo obtener una lista simple de índices? Entonces:

[0,3,1,2]

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Esta lista representa el orden en el que el árbol de expansión mínima visitó los nodos en el grafo de entrada.

    Para obtener esta lista, puedes utilizar el algoritmo DFS (búsqueda en profundidad) para recorrer el árbol de expansión mínima comenzando desde el nodo 0. Aquí tienes un ejemplo de implementación en Python:

    def dfs(nodo, visitado, lista_adj, resultado):
        visitado[nodo] = True
        resultado.append(nodo)
        for vecino in lista_adj[nodo]:
            if not visitado[vecino]:
                dfs(vecino, visitado, lista_adj, resultado)
    
    # Convertir matriz dispersa a lista de adyacencia
    lista_adj = [[] for _ in range(X.shape[0])]
    for i in range(X.shape[0]):
        for j in range(X.shape[1]):
            if X[i,j] != 0:
                lista_adj[i].append(j)
    
    # Ejecutar DFS en el árbol de expansión mínima
    visitado = [False] * X.shape[0]
    resultado = []
    dfs(0, visitado, lista_adj, resultado)
    
    print(resultado)
    # Resultado: [0, 3, 1, 2]
    

    La variable lista_adj es una lista de listas que representa la lista de adyacencia del grafo de entrada. Cada sublista contiene los índices de los nodos adyacentes al nodo correspondiente.

    La función dfs visita de forma recursiva cada nodo en el árbol de expansión mínima, comenzando desde la raíz (nodo 0). La lista visitado lleva un registro de qué nodos ya han sido visitados para evitar ciclos. La lista resultado se utiliza para almacenar el orden en el que se visitaron los nodos.

    Finalmente, se imprime la lista resultado, que debería darte el resultado deseado [0, 3, 1, 2].

Comments are closed.