def anchura(self, nodo):

        try:

            self.__camino.append(nodo.info)

        except AttributeError:

            self.__camino = [nodo.info]
            self.__arbol = Arboln()
            self.__arbol.insertar(nodo.info)

        nodo.visto = True

        for arco in nodo.arcos:

            if (arco.nodo.info in self.__camino or arco.nodo.visto == True):
                continue

            if (self.__arbol.buscar(arco.nodo.info) == False):

                self.__arbol.insertar(arco.nodo.info, nodo.info)

        pos = 0
        while (len(nodo.arcos) > pos):
            if (nodo.arcos[pos].nodo.visto == False):
                self.anchura(nodo.arcos[pos].nodo)

            pos = pos + 1

        return self.__arbol, self.__camino
    def profundidad(self, nodo):

        try:
            self.__camino.append(nodo.info)

        except AttributeError:

            self.__arbol = Arboln()
            self.__arbol.insertar(nodo.info)
            self.__camino = [nodo.info]

        nodo.visto = True
        for arco in nodo.arcos:
            if (self.__arbol.buscar(arco.nodo.info) == False
                    and arco.nodo.visto == False):
                self.__arbol.insertar(arco.nodo.info, nodo.info)

        for nodos in self.__nodos:

            if (nodos.info in self.__camino):
                continue

            self.profundidad(nodos)

        return self.__arbol
    def prim(self, nodo):

        try:

            self.__camino.append(nodo.info)
            self.__aristas = self.__aristas + nodo.arcos

        except AttributeError:
            self.__camino = [nodo.info]
            self.__pesocamino = 0
            self.__arbol = Arboln()
            self.__arbol.insertar(nodo.info)
            self.__aristas = nodo.arcos

        peso = -1
        nodo.visto = True
        for arco in self.__aristas:

            if (arco.nodo.info in self.__camino):
                continue

            if (((peso > arco.peso or peso < 0) and arco.nodo.visto == False)):
                peso = arco.peso
                self.__arcomin = arco

        if (self.__arbol.buscar(self.__arcomin.nodo.info) == False):
            self.__arbol.insertar(self.__arcomin.nodo.info, nodo.info)
            self.__pesocamino = self.__pesocamino + self.__arcomin.peso

        if (self.__arcomin.nodo.visto == True):
            return True

        if (self.prim(self.__arcomin.nodo)):
            return self.__pesocamino, self.__arbol, self.__camino
        return self.__pesocamino, self.__arbol, self.__camino
Beispiel #4
0
    def prim2(self, nodo):

        try:

            self.__camino.append(nodo.info)

            for arco in nodo.arcos:
                peso = arco.peso
                if (arco.peso <= peso):
                    self.__pesomin = arco.peso

                    self.__arcomin = arco

                if (arco.nodo.info in self.__camino):
                    continue

            if (self.__arcomin.nodo.visto == False):
                self.__arcomin.nodo.visto = True
                self.prim(self.__arcomin.nodo)

        except AttributeError:
            nodo.visto = True
            self.__arbol = Arboln()
            self.__arbol.insertar(nodo.info)
            self.__camino = [nodo.info]
            self.__pesomin = nodo.arcos[0].peso
            self.__arcomin = None

            for arco in nodo.arcos:
                if (arco.peso <= self.__pesomin):
                    self.__pesomin = arco.peso
                    self.__arcomin = arco
                if (arco.nodo.info in self.__camino):
                    continue
            if (self.__arcomin.nodo.visto == False):

                self.prim(self.__arcomin.nodo)

        return self.__camino
class Grafo:
    def __init__(self, dirigido=True):
        self.__nodos = []
        self.__dirigido = dirigido

    def buscaNodo(self, valor):
        for nodo in self.__nodos:
            if (nodo.info == valor):
                return nodo
        return False

    def enlace(self, valOrigen, valDestino, peso=1, bdir=False):

        norigen = self.buscaNodo(valOrigen)
        if (not (norigen)):
            return False

        ndestino = self.buscaNodo(valDestino)
        if (not (ndestino)):
            return False

        if (self.__dirigido == False):
            bdir = True

        norigen.enlace(ndestino, peso, bdir)
        return True

    def ins_nodo(self, valor):
        if (self.buscaNodo(valor) == False):
            nodo = Nodo(valor)
            self.__nodos.append(nodo)
            return nodo
        return False

    def eli_nodo(self, valor):
        nodoE = self.buscaNodo(valor)
        if (nodoE == False):
            return False

        for nodo in self.__nodos:
            nodo.eli_enlace(nodoE)

        self.__nodos.remove(nodoE)
        return True

    def existen_islas(self):
        for nodo in self.__nodos:
            if (len(nodo.arcos) == 0):
                esIsla = True
                for norigen in self.__nodos:
                    if (norigen.existe_enlace(nodo) != False):
                        esIsla = False
                        break

                if (esIsla == True):
                    return True
        return False

    def __str__(self):
        grafo = ""
        for nodo in self.__nodos:
            grafo = grafo + nodo.info
            arcos = ""
            for arco in nodo.arcos:
                if (arcos != ""):
                    arcos = arcos + ", "
                arcos = arcos + arco.nodo.info + ":" + str(arco.peso)
            grafo = grafo + "(" + arcos + ") "
        return grafo

    def existe_camino(self, valorigen, valdestino):
        if (self.buscaNodo(valorigen) == False
                or self.buscaNodo(valdestino) == False):
            return False
        norigen = self.buscaNodo(valorigen)
        ndestino = self.buscaNodo(valdestino)

        try:
            self.__camino.append(norigen.info)
        except:
            self.__camino = [norigen.info]

        if (norigen.existe_enlace(ndestino) != False):
            return True

        for nodo in self.__nodos:

            if (nodo.info in self.__camino):
                continue

            if (self.existe_camino(nodo.info, valdestino)):
                return True, self.__camino
        return False

    def profundidad(self, nodo):

        try:
            self.__camino.append(nodo.info)

        except AttributeError:

            self.__arbol = Arboln()
            self.__arbol.insertar(nodo.info)
            self.__camino = [nodo.info]

        nodo.visto = True
        for arco in nodo.arcos:
            if (self.__arbol.buscar(arco.nodo.info) == False
                    and arco.nodo.visto == False):
                self.__arbol.insertar(arco.nodo.info, nodo.info)

        for nodos in self.__nodos:

            if (nodos.info in self.__camino):
                continue

            self.profundidad(nodos)

        return self.__arbol

    def prim(self, nodo):

        try:

            self.__camino.append(nodo.info)
            self.__aristas = self.__aristas + nodo.arcos

        except AttributeError:
            self.__camino = [nodo.info]
            self.__pesocamino = 0
            self.__arbol = Arboln()
            self.__arbol.insertar(nodo.info)
            self.__aristas = nodo.arcos

        peso = -1
        nodo.visto = True
        for arco in self.__aristas:

            if (arco.nodo.info in self.__camino):
                continue

            if (((peso > arco.peso or peso < 0) and arco.nodo.visto == False)):
                peso = arco.peso
                self.__arcomin = arco

        if (self.__arbol.buscar(self.__arcomin.nodo.info) == False):
            self.__arbol.insertar(self.__arcomin.nodo.info, nodo.info)
            self.__pesocamino = self.__pesocamino + self.__arcomin.peso

        if (self.__arcomin.nodo.visto == True):
            return True

        if (self.prim(self.__arcomin.nodo)):
            return self.__pesocamino, self.__arbol, self.__camino
        return self.__pesocamino, self.__arbol, self.__camino

    def anchura(self, nodo):

        try:

            self.__camino.append(nodo.info)

        except AttributeError:

            self.__camino = [nodo.info]
            self.__arbol = Arboln()
            self.__arbol.insertar(nodo.info)

        nodo.visto = True

        for arco in nodo.arcos:

            if (arco.nodo.info in self.__camino or arco.nodo.visto == True):
                continue

            if (self.__arbol.buscar(arco.nodo.info) == False):

                self.__arbol.insertar(arco.nodo.info, nodo.info)

        pos = 0
        while (len(nodo.arcos) > pos):
            if (nodo.arcos[pos].nodo.visto == False):
                self.anchura(nodo.arcos[pos].nodo)

            pos = pos + 1

        return self.__arbol, self.__camino