Advertisement
tomasfdel

Complementos I Práctica Lab 1

Aug 27th, 2017
430
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.11 KB | None | 0 0
  1. #! /usr/bin/python
  2.  
  3. # 1ra Practica Laboratorio
  4. # Complementos Matematicos I
  5. # Consigna: Implementar los siguientes metodos
  6. # Team Tutturu: Tomas Fernandez De Luco, Sebastian Moline, Gianni Weinand
  7.  
  8. import sys
  9.  
  10. def lee_grafo_stdin():
  11.     '''
  12.   Lee un grafo desde entrada estandar y devuelve su representacion como lista.
  13.   Ejemplo Entrada:
  14.       3
  15.       A
  16.       B
  17.       C
  18.       A B
  19.       B C
  20.       C B
  21.   Ejemplo retorno:
  22.       (['A','B','C'],[('A','B'),('B','C'),('C','B')])
  23.   '''
  24.     V = []
  25.     E = []
  26.     cant_nodos = int(raw_input())
  27.     contador = 0
  28.     for line in sys.stdin:
  29.         contador = contador + 1
  30.         if(contador <= cant_nodos):
  31.             V.append(line[:-1])
  32.         else:
  33.             pepe = line.split()
  34.             E.append((pepe[0],pepe[1]))
  35.  
  36.     return (V,E)
  37.    
  38.  
  39.  
  40. def lee_grafo_archivo(file_path):
  41.     '''
  42.   Lee un grafo desde un archivo y devuelve su representacion como lista.
  43.   Ejemplo Entrada:
  44.       3
  45.       A
  46.       B
  47.       C
  48.       A B
  49.       B C
  50.       C B
  51.   Ejemplo retorno:
  52.       (['A','B','C'],[('A','B'),('B','C'),('C','B')])
  53.   '''
  54.     V = []
  55.     E = []
  56.     with open(file_path, "r") as f:
  57.         cant_nodos = int(f.readline())
  58.         for i in range(cant_nodos):
  59.             V.append(f.readline()[:-1])
  60.         for line in f:
  61.             pepe = line.split()
  62.             E.append((pepe[0], pepe[1]))
  63.     return (V,E)
  64.  
  65.  
  66.  
  67. def imprime_grafo_lista(grafo):
  68.     '''
  69.   Muestra por pantalla un grafo. El argumento esta en formato de lista.
  70.   '''
  71.     print("Vertices:")
  72.     for x in grafo[0]:
  73.         print x
  74.        
  75.     print("Aristas:")
  76.     for (a,b) in grafo[1]:
  77.         print(a + " " + b)
  78.    
  79.  
  80.  
  81. def lista_a_incidencia_dicc(grafo_lista):
  82.     '''
  83.   Transforma un grafo representado por listas a su representacion
  84.   en matriz de incidencia.
  85.    '''
  86.     #Creamos un diccionario de pares nodo:indice
  87.     indiceNodo = {}
  88.     for (i,v) in enumerate(grafo_lista[0]):
  89.         indiceNodo[v] = i
  90.    
  91.     #Creamos una matriz cuadrada de |V|*|E| y la llenamos de ceros.
  92.     matriz = [[0 for x in range(len(grafo_lista[1]))] for y in range(len(grafo_lista[0]))]
  93.     for (x,(a,b)) in enumerate(grafo_lista[1]):
  94.         #Sumamos 1 en el lugar que corresponde a la fila de a y la columna de (a,b)
  95.         matriz[indiceNodo[a]][x] += 1
  96.         #Sumamos 1 en el lugar que corresponde a la fila de b y la columna de (a,b)
  97.         matriz[indiceNodo[b]][x] += 1
  98.                    
  99.     return (grafo_lista[0], matriz)
  100.  
  101. def lista_a_incidencia(grafo_lista):
  102.     '''
  103.   Transforma un grafo representado por listas a su representacion
  104.   en matriz de incidencia.
  105.   '''
  106.    
  107.     matriz = [[0 for x in range(len(grafo_lista[1]))] for y in range(len(grafo_lista[0]))]
  108.     for (n,(a,b)) in enumerate(grafo_lista[1]):
  109.         for x in range(len(grafo_lista[0])):
  110.             if a == grafo_lista[0][x]:
  111.                 indiceA = x
  112.                 break
  113.         for x in range(len(grafo_lista[0])):
  114.             if b == grafo_lista[0][x]:
  115.                 indiceB = x
  116.                 break
  117.        
  118.         matriz[indiceA][n] += 1
  119.         matriz[indiceB][n] += 1
  120.                    
  121.     return (grafo_lista[0], matriz)
  122.  
  123.  
  124. def incidencia_a_lista(grafo_incidencia):
  125.     '''
  126.   Transforma un grafo representado por una matriz de incidencia a su
  127.   representacion por listas.
  128.   '''
  129.     V = grafo_incidencia[0]
  130.     E = []
  131.    
  132.     #Recorremos las filas con y
  133.     for y in range(len(V)):
  134.         #verticeA y verticeB son los indices de los vertices en los que incide una arista.
  135.         verticeA = verticeB = -1
  136.         #Recorremos la fila y con x.
  137.         for x in range(len(grafo_incidencia[1][y])):
  138.             #Si vale 2, la arista es un bucle.
  139.             if grafo_incidencia[1][y][x] == 2:
  140.                 verticeA = y
  141.                 verticeB = y
  142.                 break
  143.             #Si vale 1, es una arista normal.
  144.             if grafo_incidencia[1][y][x] == 1:
  145.                 #Si aun no asignamos verticeA, lo hacemos ahora.
  146.                 if verticeA == -1:
  147.                     verticeA = y
  148.                 #Si ya lo asignamos, queda por asignar verticeB.
  149.                 else:
  150.                     verticeB = y
  151.                     break
  152.         #Agregamos la arista a la lista, recordando que verticeA y verticeB son indices de V.
  153.         E.append((V[verticeA],V[verticeB]))
  154.     return (V,E)
  155.    
  156.  
  157.  
  158. def imprime_grafo_incidencia(grafo_incidencia):
  159.     '''
  160.   Muestra por pantalla un grafo.
  161.   El argumento esta en formato de matriz de incidencia.
  162.   '''
  163.     print("Vertices:")
  164.     for x in grafo_incidencia[0]:
  165.         print x
  166.        
  167.     print("Matriz de incidencia:")
  168.     for x in grafo_incidencia[1]:
  169.         print x
  170.  
  171.  
  172. def lista_a_adyacencia_dicc(grafo_lista):
  173.     '''
  174.   Transforma un grafo representado por listas a su representacion
  175.   en matriz de adyacencia.
  176.   '''
  177.     #Creamos un diccionario de pares nodo:indice
  178.     indiceNodo = {}
  179.     for (i,v) in enumerate(grafo_lista[0]):
  180.         indiceNodo[v] = i
  181.    
  182.     #Creamos una matriz de |V|*|V| y la llenamos de ceros.
  183.     matriz = [[0 for x in range(len(grafo_lista[0]))] for y in range(len(grafo_lista[0]))]
  184.     #Recorremos las aristas.
  185.     for (a,b) in grafo_lista[1]:
  186.         #En los lugares correspondientes al par de nodos, sumamos 1 por cada arista.
  187.         matriz[indiceNodo[a]][indiceNodo[b]] += 1
  188.         matriz[indiceNodo[b]][indiceNodo[a]] += 1
  189.        
  190.     return (grafo_lista[0], matriz)
  191.  
  192. def lista_a_adyacencia(grafo_lista):
  193.     '''
  194.   Transforma un grafo representado por listas a su representacion
  195.   en matriz de adyacencia.
  196.   '''
  197.     matriz = [[0 for x in range(len(grafo_lista[0]))] for y in range(len(grafo_lista[0]))]
  198.     for(a,b) in grafo_lista[1]:
  199.         for x in range(len(grafo_lista[0])):
  200.             if a == grafo_lista[0][x]:
  201.                 indiceA = x
  202.                 break
  203.  
  204.         for x in range(len(grafo_lista[0])):
  205.             if b == grafo_lista[0][x]:
  206.                 indiceB = x
  207.                 break
  208.         matriz[indiceA][indiceB] += 1
  209.         matriz[indiceB][indiceA] += 1
  210.        
  211.     return (grafo_lista[0], matriz)
  212.  
  213.  
  214.  
  215. def adyacencia_a_lista(grafo_adyacencia):
  216.     '''
  217.   Transforma un grafo representado una matriz de adyacencia a su
  218.   representacion por listas.
  219.   '''
  220.     V = grafo_adyacencia[0]
  221.     E = []
  222.     #Con y recorremos las filas de la matriz de adyacencia.
  223.     for y in range(len(grafo_adyacencia[1])):
  224.         #Comenzamos desde y para no repetir aristas.
  225.         for x in range(y,len(grafo_adyacencia[1])):
  226.             #Si x==y, estamos en un bucle y cada arista aumenta el valor en la matriz en 2.
  227.             if x == y:
  228.                 step = 2
  229.             #Si no, hay tantas aristas como el valor de la matriz.
  230.             else:
  231.                 step = 1
  232.             #Contando las aristas como corresponde, las agregamos a la lista.
  233.             for i in range(0, grafo_adyacencia[1][y][x], step):
  234.                 #La arista es la tupla de nodos en las posiciones y, x de V.
  235.                 E.append((V[y], V[x]))
  236.     return (V,E)
  237.  
  238. def imprime_grafo_adyacencia(grafo_adyacencia):
  239.     '''
  240.   Muestra por pantalla un grafo.
  241.   El argumento esta en formato de matriz de adyacencia.
  242.   '''
  243.     print("Vertices:")
  244.     for x in grafo_adyacencia[0]:
  245.         print x
  246.        
  247.     print("Matriz de adyacencia:")
  248.     for x in grafo_adyacencia[1]:
  249.         print x
  250.  
  251.  
  252. #################### FIN EJERCICIO PRACTICA ####################
  253. grafo_adyacencia1 = (
  254.     ['A', 'B', 'C', 'D'],
  255.     [[0, 1, 0, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0],]
  256. )
  257.  
  258. grafo_adyacencia2 = (
  259.     ['A', 'B', 'C', 'D'],
  260.     [[0, 2, 0, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0],]
  261. )
  262.  
  263. def lee_entrada_1():
  264.     count = 0
  265.     for line in sys.stdin:
  266.         count = count + 1
  267.         print 'Linea: [{0}]'.format(line)
  268.     print 'leidas {0} lineas'.format(count)
  269.  
  270.    
  271. def lee_entrada_2():
  272.     count = 0
  273.     try:
  274.         while True:
  275.             line = raw_input()
  276.             count = count + 1
  277.             print 'Linea: [{0}]'.format(line)
  278.     except EOFError:
  279.         pass
  280.    
  281.     print 'leidas {0} lineas'.format(count)
  282.    
  283.  
  284. def lee_archivo(file_path):
  285.     print 'leyendo archivo: {0}'.format(file_path)
  286.     count = 0
  287.  
  288.     with open(file_path, 'r') as f:
  289.         first_line = f.readline()
  290.         print 'primer linea: [{}]'.format(first_line)
  291.         for line in f:
  292.             count = count + 1
  293.             #print 'Linea: [{0}]'.format(line)    
  294.     print 'leidas {0} lineas'.format(count)
  295.  
  296.  
  297. def main():
  298.     grafo = lee_grafo_archivo(sys.argv[1])
  299.     imprime_grafo_lista(grafo)
  300.     print
  301.     imprime_grafo_adyacencia(lista_a_adyacencia(grafo))
  302.     imprime_grafo_lista(adyacencia_a_lista(lista_a_adyacencia(grafo)))
  303.     print
  304.     imprime_grafo_incidencia(lista_a_incidencia(grafo))
  305.     imprime_grafo_lista(incidencia_a_lista(lista_a_incidencia(grafo)))
  306.     #~ # Para leer desde un archivo
  307.     #    if (len(sys.argv) < 2):
  308.     #        print 'ERROR. Argumento (file) faltante'
  309.     #        return    
  310.     #    lee_archivo(sys.argv[1])
  311.    
  312.  
  313. if __name__ == '__main__':
  314.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement