Advertisement
Guest User

Untitled

a guest
Jun 28th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. def ciclo_k(grafo, k):
  2.     '''Realiza una muestra de algun ciclo de la red con un recorrido dfs,
  3.        donde al menos se debe mostrar k articulos.
  4.        Pre: El grafo fue creado.
  5.        Pos: Devuelve un ciclo de la red o una exepcion en caso de no tener ningun ciclo
  6.         con esa cantidad de k articulos como minimo.'''
  7.     orden, padre = dfs_aristas_retr(grafo,None,k)
  8.     ciclo = []
  9.     for x in orden:
  10.         if orden[x] != None:
  11.             ciclo.append(orden[x])
  12.     ciclo.reverse()
  13.     fin = len(ciclo)-1
  14.     f = ciclo[fin]
  15.     ciclo.insert(0,f)
  16.     return ciclo
  17.  
  18.  
  19. def dfs_aristas_retr(grafo,inicio, k):
  20.     '''Realiza un recorrido dfs sobre un grafo no dirigido, termina el recorrido
  21.         cuando encuentra una arista de retorno, es decir, encuentra un ciclo.
  22.         Pre: El grafo ha sido creado
  23.         Pos: Devuelve una lista con el ciclo, o NULL si no encontro ciclo.'''
  24.     if not inicio: #Si no recibí inicio, elijo uno cualquiera
  25.             claves = grafo.vertices.keys()
  26.             inicio = claves[0]
  27.     padre = {}
  28.         visitado = {}
  29.     orden = {}
  30.     for x in grafo.vertices:
  31.             visitado[x] = False
  32.             padre[x] = None
  33.         orden[x] = 0
  34.         dfs_recurs(grafo, inicio, visitado, padre, orden, k)
  35.         return padre,orden
  36.  
  37. def dfs_recurs(G, v, visitados, padre, orden, k):
  38.     '''Funcion recursiva que desciende en profundidad sobre un grafo.'''  
  39.     visitados[v] = True
  40.     for w in G.adyacentes(v):
  41.         n = orden[v]
  42.         encontro_ciclo = False
  43.         if not visitados[w]:
  44.                 padre[w] = v
  45.                 orden[w] = orden[v]+1
  46.                 dfs_recurs(G, w, visitados, padre, orden, k)
  47.  
  48.         elif visitados[w]:
  49.                 padre[w] = v
  50.                 orden[w] = orden[v]+1
  51.                     if k <= n :     #Encontro el ciclo correcto {EN ESTE IF NO ENTRA NUNCA}
  52.                     encontro_ciclo = True
  53.         elif (encontro_ciclo):
  54.             break                  
  55.     return
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement