View difference between Paste ID: aTPY7ryE and LcSBiHxD
SHOW: | | - or go back to the newest paste.
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-
			if k <= n :     #Encontro el ciclo correcto {EN ESTE IF NO ENTRA NUNCA}
13+
	fin = len(ciclo)-1
14-
				encontro_ciclo = True 
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