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
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