LIMA – PERÚ – 2020
GRAFOS
ESTRUCTURA DE DATOS
Docente : Ing. Víctor Poma
Facultad: Ingeniería de Sistemas Computacionales
DEFINICIÓN
Un grafo está formado por entes físicos o conceptuales y las relaciones entre ellos un
conjunto de vértices o nodos V, que representan a los entes, y un conjunto de arcos A,
que representan las relaciones entre vértices.
Vértice
A B
E Arco E
D C
GRADO DIRIGIDO
• Se distingue entre grado de entrada y grado de salida; grado de entrada de un
nodo v, gradent(v), es el número de arcos que llegan a v; grado de salida de v,
gradsal(v), es el número de arcos que salen de v.
IA HW
DB
RN SW
CAMINO
• La longitud de un camino es el número de arcos del camino. En un grafo valorado, la
longitud del camino con pesos es la suma de los pesos de los arcos en el camino.
P2= (IA,ML)
IA HW P1= (DB,RN,SW,HW)
DB
ML
RN SW
GRAFO DIRIGIDO CON CICLOS
• En un grafo dirigido, un ciclo es un camino simple cerrado. Por tanto, un ciclo
empieza y termina en el mismo nodo, v0 = vn, y además, debe tener más de un arco.
Un grafo dirigido sin ciclos (a cíclico) se acostumbra a denominar GDA (Grafo
Dirigido A cíclico),
C
B
A
D E
GRADO NO DIRIGIDO
• Se distingue entre grado de entrada y grado de salida; grado de entrada de un
nodo v, gradent(v), es el número de arcos que llegan a v; grado de salida de v,
gradsal(v), es el número de arcos que salen de v.
IA HW
DB
RN SW
GRADO DIRIGIDO (GRAFO CONEXO)
Un grafo no dirigido es conexo si existe un camino entre cualquier par de nodos que
forman el grafo. Un grafo dirigido con esta propiedad se dice que es fuertemente
conexo. Además, un grafo completo es aquel que tiene un arco para cualquier par de
vértices.
3 5
7
2
GRADO DIRIGIDO (GRAFO FUERTEMENTE CONEXO)
Un grafo no dirigido es conexo si existe un camino entre cualquier par de nodos que
forman el grafo. Un grafo dirigido con esta propiedad se dice que es fuertemente
conexo. Además, un grafo completo es aquel que tiene un arco para cualquier par de
vértices.
4
8
5
6
MATRIZ DE ADYACENCIA (GRAFO DIRIGIDO)
La característica mas importante de un grafo, que distingue a uno de otro, es el conjunto
de pares de vértices que están relacionados, o que son adyacentes. Por ello, la forma
más sencilla de representación es mediante una matriz, de tantas filas/columnas como
nodos, que permite modelar fácilmente esa cualidad.
4
8
5
6
MATRIZ DE ADYACENCIA
La característica mas importante de un grafo, que distingue a uno de otro, es el conjunto
de pares de vértices que están relacionados, o que son adyacentes. Por ello, la forma
más sencilla de representación es mediante una matriz, de tantas filas/columnas como
nodos, que permite modelar fácilmente esa cualidad.
0 1 1 0 0
1 0 1 0 0
A= 0 1 1 0 0
0 1 1 0 0
1 0 0 0 0
MATRIZ DE ADYACENCIA (GRAFO NO DIRIGIDO)
4 0 1 0 1 1
1 0 1 0 0
A= 0 1 0 1 1
1 0 1 0 0
5 1 0 1 0 0
6
LISTAS DE ADYACENCIA
Las listas de adyacencia son una estructura multienlazada formada por una tabla
directorio en la que cada elemento representa un vértice del grafo, del cual emerge una
lista enlazada con todos sus vértices adyacentes. Es decir, cada lista representa los
arcos con el vértice origen del nodo de la lista directorio, por eso se llama lista de
adyacencia.
LISTAS DE ADYACENCIA
Si se analiza el vértice 5, es adyacente a los vértices 1, 2 y 4; por ello su lista de
adyacencia consta de tres nodos, cada uno con el vértice destino que forma el arco. El
vértice 4 no es origen de ningún arco, su lista de adyacencia está vacía.
1 3 4
2 3
3 1
5 1 2 4
OPERACIONES CON LISTAS ADYACENCIA
Nuevo vértice
Añade un nuevo vértice a la lista directorio. Si el vértice ya está en la tabla no hace nada,
devuelve control; si es nuevo, se asigna a continuación del último. La implementación no
considera que pueda haber overflow; el lector puede implementar un método auxiliar que
duplique la tabla si ésta se llena. El tiempo de la operación depende de la búsqueda, en
el peor caso es lineal, O(n) siendo n el número de nodos.
OPERACIONES CON LISTAS ADYACENCIA
Arista
Esta operación da entrada a un arco del grafo. El método tiene como entrada el vértice
origen y el vértice destino. El método adyacente() determina si la arista ya está en la lista
de adyacencia,
OPERACIONES CON LISTAS ADYACENCIA
Borrar arco
La operación consiste en eliminar el nodo de la lista de adyacencia del vértice origen que
contiene el arco del vértice destino. Una vez encontrada la dirección de ambos vértices
en la lista de nodos se accede a la correspondiente lista de adyacencia para proceder a
borrar el nodo que contiene el vértice destino.
OPERACIONES CON LISTAS ADYACENCIA
Adyacente
La operación determina si dos vértices, v1 y v2, forman un arco. En definitiva, si el
vértice v2 está en la lista de adyacencia de v1. El método buscarLista() devuelve la
dirección del nodo que contiene al arco, si no está devuelve null.
OPERACIONES CON LISTAS ADYACENCIA
Borrar vértice
Eliminar un vértice de un grafo es una operación que puede ser considerada costosa en
tiempo de ejecución, ya que supone acceder a cada uno de los elementos de la
multiestructura. En primer lugar, hay que buscar la dirección (puntero) del vértice en la
lista directorio. En segundo lugar, eliminar cada uno de los nodos de la correspondiente
lista de adyacencia. Y por último, recorrer cada lista de adyacencia y si encuentra algún
arco con el vértice que se está borrando, se elimina de la lista. (Se deja como ejercicio la
implementación de la operación.)
RECORRIDO DE UN GRAFO
El recorrido se inicia a partir del nodo D, se marca y se mete en la pila. Iterativamente,
se quita el nodo cabeza, se procesa, se meten en la pila sus adyacentes no marcados y
se marcan.
FILA VERTICES PROCESADOS
D D
B C C
B R R
B H H
B A T T
B A A
Pila vacia B
CONEXIONES EN UN GRAFO
El algoritmo para determinar las componentes conexas de un grafo G se basa en el
recorrido del grafo (en anchura o en profundidad). Los pasos a seguir son los siguientes:
1. Realizar un recorrido del grafo a partir de cualquier vértice w.
2. Si en el recorrido se han marcado todos los vértices, entonces el grafo es conexo.
3. Si el grafo no es conexo, los vértices marcados forman una componente conexa.
4. Se toma un vértice no marcado, z, y se realiza de nuevo el recorrido del grafo a partir.
5. El algoritmo termina cuando todos los vértices han sido marcados (visitados)
BUSQUEDA DE LOS PUNTOS DE ARTICULACIÒN
Los sucesivos vértices por los que se pasa en el recorrido en profundidad de un
grafo se puede representar mediante un árbol de expansión. La raíz del árbol es el
vértice de partida, A y cada arco del grafo será una arista en el árbol.
E
A D E
E Árbol de expansión
B C F
E
Grafo no dirigido E E
CASO PRACTICO
Programar en Java.
Te invito a ver el video explicativo para poner en practica los
conocimientos empleados en esta presentación.
EJEMPLO
Se tiene el siguiente gafo, codificar en java para interpretar la conexión entre vértices por
cada camino.
3
A B
1
3 3
E C
2
3
1
D
F 3