Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Digrafos
Digrafos
Los grafos dirigidos son grafos en los que las aristas tienen una dirección definida;
por ejemplo, se puede dar el caso de poder ir del nodo A al nodo B, pero no al revés.
En la mayoría de los casos la dirección de las aristas indica algún tipo de relación de
precedencia entre los nodos. Los grafos dirigidos pueden ser usados para:
Modelar líneas de fabricación, en las que diferentes procesos dependen de
otros
Manejar dependencias en la compilación de archivos, como hace el make
Un ejemplo de grafo dirigido podría ser:
A H I
B C G
D E J K
F L M
Podemos ver claramente que por ejemplo, existe una arista de A a G, pero no de G a
A. Sin embargo, está permitido que halla dos aristas de direcciones distintas entre los
mismos nodos, como por ejemplo entre H e I, y entre L y M.
Recorrer (grafo G) {
marcar_visitado(todos F);
for (todos vértices V de G)
DFS (G V);
}
DFS (vértice V) {
visitar(V);
marcar_visitado(V);
for ( ; v ; v = SgteAdy)
if (!visitado(V))
DFS(V);
}
Aplicando este algoritmo al grafo anterior podemos visitar los nodos en el orden:
AFEDBGJKLMCHI
Este orden no es el único posible, podría haber empezado por otro nodo, o haber
seguido otro orden entre los adyacentes.
Notamos también que pese a que el H e I están conectados al gráfico, no pueden ser
accedidos desde A; es necesario cambiar de nodo, y empezar a recorrerlo de nuevo.
Es decir, en vez de representarse el recorrido como un árbol, se representa como un
bosque. Si se hubiera empezado a recorrer el grafo por H, podría haber recorrido
todos los nodos dentro del mismo árbol de recorrido, puesto que desde H puedo
acceder a cualquier nodo.
Cierre transitivo
El cálculo de cierre transitivo permite saber si existe un camino de longitud mayor o
igual a 1 entre dos nodos dados. Es decir, indica que nodos están de alguna forma
conectados.
Para esto es útil trabajar con la matriz de adyacencias, colocando un 1 en los nodos
que están conectados, y un 0 en los que no lo están. De esta forma, para este grafo la
matriz quedaría:
A B C D E F G H I J K L M
A 1 1 0 0 0 1 1 0 0 0 0 0 0
B 0 1 0 0 0 0 0 0 0 0 0 0 0
C 1 0 1 0 0 0 0 0 0 0 0 0 0
D 0 0 0 1 0 1 0 0 0 0 0 0 0
E 0 0 0 1 1 0 0 0 0 0 0 0 0
F 0 0 0 0 1 1 0 0 0 0 0 0 0
G 0 0 1 0 1 0 1 0 0 1 0 0 0
H 0 0 0 0 0 0 1 1 1 0 0 0 0
I 0 0 0 0 0 0 0 1 1 0 0 0 0
J 0 0 0 0 0 0 0 0 0 1 1 1 1
K 0 0 0 0 0 0 0 0 0 0 1 0 0
L 0 0 0 0 0 0 1 0 0 0 0 1 1
M 0 0 0 0 0 0 0 0 0 0 0 1 1
Si sobre esta matriz se ejecuta el siguiente algoritmo (inventado por S. Warshall en
1962), se obtiene la matriz de adyacencias que corresponde al cálculo del cierre
transitivo para todo par de nodos X e Y:
A B C D E F G H I J K L M
A 1 1 1 1 1 1 1 0 0 1 1 1 1
B 0 1 0 0 0 0 0 0 0 0 0 0 0
C 1 1 1 1 1 1 1 0 0 1 1 1 1
D 0 0 0 1 1 1 0 0 0 0 0 0 0
E 0 0 0 1 1 1 0 0 0 0 0 0 0
F 0 0 0 1 1 1 0 0 0 0 0 0 0
G 1 1 1 1 1 1 1 0 0 1 1 1 1
H 1 1 1 1 1 1 1 1 1 1 1 1 1
I 1 1 1 1 1 1 1 1 1 1 1 1 1
J 1 1 1 1 1 1 1 0 0 1 1 1 1
K 0 0 0 0 0 0 0 0 0 0 1 0 0
L 1 1 1 1 1 1 1 0 0 1 1 1 1
M 1 1 1 1 1 1 1 0 0 1 1 1 1
Fijándonos en el grafo, vemos que para cada fila aparece todos los nodos a los que
puedo llegar desde la misma. Como vimos en la búsqueda primero en profundidad, los
nodos H e I no pueden ser accedidos desde el resto del grafo, lo que se puede ver en
la matriz de cierre transitivo. A su vez, desde H o I puedo acceder al resto del grafo, lo
que también pude observarse en la matriz.
Vemos que el algoritmo contiene 3 bucles anidados, es claramente de tipo O(n 3),
siendo n = V, la cantidad de nodos del grafo.
También existe, como puede suponerse, una versión recursiva de este algoritmo, que
es de tipo O(n2), pero es de implementación más complicada (aparte de por ser
recursiva, consumir más memoria).
Orden Topológico
El orden topológico es el mismo que fue definido en clase. Como puede suponerse,
el orden puede solo ser determinado en un grafo dirigido acíclico, o DAG (Directed
Acyclic Graph). De esta forma, se puede observar un orden parcial entre nodos,
ordenándolos de forma tal que ningún nodo es visitado antes que los nodos que
apuntan a el. Si por ejemplo, el grafo representa los diferentes pasos en un proceso,
ningún paso es ejecutado antes de los que le preceden.
En algunas aplicaciones puede ser necesario usar un orden topológico inverso. En
este caso se tienen dos posibilidades:
Recorrer el grafo en orden y almacenar los nodos en una pila, para luego
sacarlos en el orden topológico inverso.
Recorrer el grafo primero en profundidad, pero marcando los nodos como
visitados al final del algoritmo, y no al principio.