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 |