示例#1
0
def find_path(G, s, t):
    def quedan_vecinos(v):
        for u in v.lista_vecinos:
            if u.color == 'W':
                return True
        return False

    for nodo in G:
        nodo.padre = None
        if nodo.color == 'G':
            nodo.color = 'W'

    s.color = 'G'
    stack = Lista()
    stack.append(s)

    while stack:
        u = stack.pop()
        for nodo in u.lista_vecinos:
            if nodo.color == 'W':
                nodo.color = 'G'
                nodo.padre = u
                stack.append(nodo)
                print(quedan_vecinos(nodo))
                if not quedan_vecinos(nodo):
                    nodo.color = 'B'

    return backtrack(t)
示例#2
0
 def lista_vecinos(self):
     """
     Retorna una lista de objetos tipo Puerto con los puertos adyacentes a self
     :return: Lista
     """
     lista_vecinos = Lista()
     for lista in self.vecinos.values:
         for vecino in lista:
             if vecino not in lista_vecinos:
                 lista_vecinos.append(vecino)
     return lista_vecinos
示例#3
0
def backtrack(v):
    """
    Algortimo recursivo para encontrar el camino desde v hasta 0
    :param v: Objeto del tipo Nodo (o Puerto)
    :return: Objeto del tipo list, que es el camino ivertido mas corto desde el vertive v hasta el vertice 0
    """
    camino = Lista()
    camino.append(v)

    if v.padre:
        camino += backtrack(v.padre)
    return camino
示例#4
0
    class Nodo:
        def __init__(self, nombre, capacidad):
            self.nombre = nombre
            self.lista_vecinos = Lista()
            self.distancia = None
            self.padre = None
            self.visto = False
            self.calculado = False
            self.capacidad = capacidad
            self.color = 'W'

        def agregar_vecino(self, *nodos):
            for nodo in nodos:
                self.lista_vecinos.append(nodo)

        def __repr__(self):
            return '{0}'.format(self.nombre)
示例#5
0
    def obtener_conexiones(self):
        lista_conexiones = Lista()
        for m in self.puertos:

            for (u, vecino) in self.puertos[m].vecinos.items:
                if len(vecino) >= 3:
                    for v in vecino:
                        lista_conexiones.append(Tupla(m, v, 'RAND'))
                elif len(vecino) == 2:
                    for v in vecino:
                        lista_conexiones.append(Tupla(m, v, 'ALT'))
                elif len(vecino) == 1:
                    for v in vecino:
                        lista_conexiones.append(Tupla(m, v, ''))
        return lista_conexiones
示例#6
0
    def dfs(v):

        caminos = Lista()
        for nodo in G:
            nodo.padre = None

        stack = Lista()
        v.visto = True
        stack.append(v)

        while stack:

            u = stack.pop()

            for w in u.lista_vecinos:
                if not w.visto and conected(w, u):
                    w.visto = True
                    w.padre = u
                    stack.append(w)
            camino = backtrack(u)
            if len(camino) > 1:
                caminos.append(backtrack(u))

        return caminos