-
Notifications
You must be signed in to change notification settings - Fork 0
/
dag.py
70 lines (50 loc) · 2.07 KB
/
dag.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# Clase del grafo
class Graph:
# Constructor
def __init__(self, edges, N):
# Lista de lista para representar la adyacencia
self.adj_list = [[] for _ in range(N)]
# Almacena el grado del vertice
self.degree = [0] * N
# add edges to the undirected graph
for (start, end) in edges:
# Se agrega un vetice desde su inicio hasta su destino
self.adj_list[start].append(end)
# Cada vez que se agrega, se incrementa el grado del vertice
self.degree[end] = self.degree[end] + 1
# Función para encontrar todos los ordenamentos topológicos
def all_topological_orders(graph, path, visited, n):
# Se itera por cada vertice
for v in range(n):
# Si el nodo no ha sido visitado se hace lo siguiente...
if graph.degree[v] == 0 and not visited[v]:
# Para cada vertice se reduce el grado en 1
for u in graph.adj_list[v]:
graph.degree[u] = graph.degree[u] - 1
# Se agrega el vertice a la ruta
path.append(v)
visited[v] = True
# Se aplica la recursión para seguir con el siguiente nodo...
all_topological_orders(graph, path, visited, n)
# Se limpia la información de la visita pasada
for u in graph.adj_list[v]:
graph.degree[u] = graph.degree[u] + 1
# Se remueve el vertice de la ruta pasada
path.pop()
visited[v] = False
# Una vez finaliza el recorrido se imprime el path
if len(path) == n:
print(path)
def print_topological_orders(graph):
n = len(graph.adj_list)
visited = [False] * n
path = []
all_topological_orders(graph, path, visited, n)
# Probar el código
if __name__ == "__main__":
# Número de vetices y aristas
n = 6
edges = [(5, 2), (5, 0), (4, 0), (4, 1), (2, 3), (3, 1)]
print("Posibles ordenamientos:")
graph = Graph(edges, n)
print_topological_orders(graph)