Esempio n. 1
0
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")
Esempio n. 2
0
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")
Esempio n. 3
0
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)
Esempio n. 4
0
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')
Esempio n. 6
0
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')