def cargargrafo(): #Modificacion del archivo main para cargar grafo desde archivo del TP #----------------------- archi = open('d1.txt', 'r') cant_v = int(archi.readline()) cant_a = int(archi.readline()) grafo = digrafo.Digrafo(cant_v) for i in range(cant_a): ori, des = archi.readline().split(" ") grafo.agregarArista(int(ori), int(des)) archi.close() #------------------------ print(grafo.obtenerNumeroDeVertices()) print(grafo.obtenerNumeroDeAristas()) print("El grafo G es: ") print(grafo.obtenerGrafo()) print("El grafo G transpuesto es: ") print(grafo.transponer().obtenerGrafo()) print("Estas son las componentes fuertemente conexas del grafo dado:") grafo.imprimirCFC() print("El grafo G tiene " + str(grafo.obtenerNumeroDeCFC()) + " componentes fuertemente conexas")
def aleatorio(): #Para generar aleatoriamente grafos de v vertices y a aristas sin loops #diferentes cantidades de vertices cantidades = [10, 100, 1000, 10000] #proporcion de aristas con respecto a vertices factor = 2.5 #genera un grafo por cada valor en la lista cantidades for v in cantidades: grafo = digrafo.Digrafo(v) a = int(v * factor) for i in range(a): ori = random.randint(0,v-1) des = ori while (des == ori) or (des in grafo.adyacentes[ori]): des = random.randint(0,v-1) grafo.agregarArista(ori, des) print("Numero de vertices: " + str(grafo.obtenerNumeroDeVertices())) print("Numero de aristas: " + str(grafo.obtenerNumeroDeAristas())) #print("El grafo es: ") #print(grafo.obtenerGrafo()) print("\n")
def comunidadesEnFalla(): #----------------------- # abre un archivo con datos archi = open('d1.txt', 'r') # obtiene cantidad de vertices y aristas cant_v = int(archi.readline()) cant_a = int(archi.readline()) # crea un grafo vacío grafo = digrafo.Digrafo(cant_v) # obtiene las aristas y las agrega al grafo for i in range(cant_a): ori, des = archi.readline().split(" ") grafo.agregarArista(int(ori), int(des)) archi.close() #------------------------ imprimirCFC(grafo)
def main(): grafo = digrafo.Digrafo(5) print(grafo.obtenerNumeroDeVertices()) print(grafo.obtenerNumeroDeAristas()) grafo.agregarArista(1, 0) grafo.agregarArista(0, 2) grafo.agregarArista(2, 1) grafo.agregarArista(0, 3) grafo.agregarArista(3, 4) print("El grafo G es: ") print(grafo.obtenerGrafo()) print("El grafo G transpuesto es: ") print(grafo.transponer().obtenerGrafo()) print("Estas son las componentes fuertemente conexas del grafo dado:") grafo.imprimirCFC() print("El grafo G tiene " + str(grafo.obtenerNumeroDeCFC()) + " componentes fuertemente conexas")
def Puntos_Falla(): # abre un archivo con datos arch = str(sys.argv[1]) archivo = open(arch + ".txt",'r') # obtiene cantidad de vertices y aristas cant_v = int(archivo.readline()) cant_a = int(archivo.readline()) # crea un grafo con cant_v vertices, sin aristas grafo = digrafo.Digrafo(cant_v) # obtiene las aristas y las agrega al grafo for i in range(cant_a): o, d = archivo.readline().split(" ") grafo.agregarArista(int(o), int(d)) grafo.agregarArista(int(d), int(o)) # cierra el archivo archivo.close() # --------------------------------- # para medir la ejecucion inicio = time() # marca todos los vertices como no visitados visitado = [False] * (cant_v) # inicializa momentos de descubrimiento descubrimiento = [0] * (cant_v) # inicializa valores bajo bajo = [0] * (cant_v) # inicializa ancestros ancestro = [-1] * (cant_v) # inicializa puntos de articulacion puntos = [False] * (cant_v) #inicializa cantidad de hijos para cada vertice cant_h = [0] * (cant_v) # inicializa momento del descubrimiento momento = 0 # contador de puntos de articulacion encontrados cant_p = 0 sys.setrecursionlimit(50000) # llama al metodo recursivo para cada vertice for i in range(cant_v): if visitado[i] == False: visitado[i] = True PADFS(grafo, cant_h, i, visitado, bajo, descubrimiento, momento, cant_p, ancestro, puntos) # para medir la ejecucion fin = time() print("\nPuntos de falla, version recursiva") # muestra el resultado y el tiempo utilizado print('Archivo: ',arch,".txt",sep="") #print(grafo.obtenerGrafo()) # cuenta y muestra los puntos de articulación encontrados print('Cantidad de vertices: ', cant_v) print('Cantidad de aristas : ', cant_a) print("Puntos de articulacion : ",) for index, value in enumerate (puntos): if value == True: print(index, " ",end="") cant_p += 1 print("\nCantidad de puntos de articulacion: ", cant_p) print('Tiempo de ejecucion: ', (fin - inicio) * 1000, 'milisegundos\n')
def Puntos_Falla(): # abre un archivo con datos arch = str(sys.argv[1]) archivo = open(arch + ".txt", 'r') # obtiene cantidad de vertices y aristas cant_v = int(archivo.readline()) cant_a = int(archivo.readline()) # crea un grafo con cant_v vertices, sin aristas grafo = digrafo.Digrafo(cant_v) # obtiene las aristas y las agrega al grafo for i in range(cant_a): o, d = archivo.readline().split(" ") grafo.agregarArista(int(o), int(d)) grafo.agregarArista(int(d), int(o)) # cierra el archivo archivo.close() #--------------------------------- # lista para guardar los visitados visitado = [] # marca todos los vertices como no visitados visited = [False] * (cant_v) # inicializa momentos de descubrimiento descubrimiento = [0] * (cant_v) # inicializa valores bajo bajo = [0] * (cant_v) # inicializa ancestros ancestro = [-1] * (cant_v) # inicializa puntos de articulacion puntos = [False] * (cant_v) #inicializa cantidad de hijos para cada vertice cant_h = [0] * (cant_v) # crea e inicializa la pila y pila_aux pila = [] pila.append(0) pila_aux = set() pila_aux.add(0) # contador de puntos de articulacion cant_p = 0 # momento de descubrimiento momento = 0 # para medir la ejecucion inicio = time() # visita los nodos del grafo usando DFS, creando las listas de # visitados, descubrimiento, bajo, cantidad de hijos y ancestros while pila: v = pila.pop() if visited[v] == False: visited[v] = True visitado.append(v) descubrimiento[v] = momento bajo[v] = momento momento += 1 # agrega a la pila los adyacentes del nodo no visitados, for i in grafo.adyacentes[v]: if (visited[i] == False) and (i not in pila_aux): pila_aux.add(i) pila.append(i) cant_h[v] += 1 ancestro[i] = v bajo[v] = min(bajo[v], bajo[i]) # recorre visitados, obtiene puntos de articulacion while visitado: v = visitado.pop() a = ancestro[v] # si el nodo es raiz y tiene dos o mas hijos, # el nodo es punto de articulacion if (a == -1) and (cant_h[v] >= 2): puntos[v] = True # si el nodo no es raiz, y su valor bajo es mayor o igual # al momento de descubrimiento de su ancestro, # entonces el ancestro es punto de articulacion if (a != -1) and (bajo[v] >= descubrimiento[a]): puntos[a] = True fin = time() #--------------------------- # muestra el resultado y el tiempo utilizado print("\nPuntos de falla, version iterativa") print('Archivo: ', arch, ".txt") print('Cantidad de vertices: ', cant_v) print('Cantidad de aristas : ', cant_a) print("Puntos de articulacion : ", end="") for index, value in enumerate(puntos): if value == True: print(index, end=" ") cant_p += 1 print("\nCantidad de puntos de articulacion: ", cant_p) print('Tiempo de ejecucion: ', (fin - inicio) * 1000, 'milisegundos\n')