Diplomado en Informática Aplicada

Asignatura: Estructura de Datos Avanzada Tema: Grafos

Centro de Estudio de Ingeniería de Sistemas (CEIS) Instituto Superior Politécnico ³José Antonio Echeverría´ (CUJAE)

Tema 4: Grafos
Contenido ‡ Definición de grafo. ‡ Operaciones sobre grafos. ‡ Representación matricial de grafos en un lenguaje de programación. ‡ Grafos (representación enlazada) ‡ Operaciones sobre grafos representados de manera enlazada. ‡ Representación enlazada de grafos en un lenguaje de programación

Bibliografía
‡ Data Structures / Algorithms in Java. Robert Lafore. Páginas: 280-370

‡ Thinking in Java. Páginas: 395-445. ‡ Aprenda Java como si estuviera en primero. Páginas: 135-139. ‡ Aprenda Java en 21 días. Páginas: 135-151. ‡ El C++. Lenguaje de Programación. Bjarne Stroustrup. Páginas 143-180 :.

Objetivos
Conozcan las estructuras de datos arbóreas y las formas de trabajar con ellas en la solución de problemas de mediana complejidad

Introducción
Estructuras de datos estudiadas: Listas lineales y sus variantes. Las relaciones entre los nodos de información son lineales. ‡Todos los nodos tienen un único antecesor, excepto el primero que no tiene antecesor. ‡Todos los nodos tienen un único sucesor, excepto el último que no tiene sucesor.

exceptuando al nodo raíz del árbol. ‡ Se puede establecer un camino único desde el nodo raíz hasta un nodo cualquiera del árbol.Introducción Estructuras de datos estudiadas: Los árboles y sus variantes Cuando se está en presencia de relaciones no lineales de tipo jerárquica. . ‡ Cada nodo tiene un único padre. se utilizan los árboles. ‡ Un nodo puede tener más de un sucesor. que no tiene padre.

Introducción En ocasiones. entre otros. Existen varios caminos entre un nodo y otro. incluso. ‡ Afinidad entre miembros de un colectivo. Ejemplo: ‡ Una red hidráulica. ‡ Caminos entre ciudades. . se requiere tener acceso a un nodo determinado a partir de más de un nodo de la estructura.

Introducción Ciudad B Ciudad A Ciudad F Ciudad C Ciudad E Ciudad D Caminos entre ciudades .

G E llamado subárbol de la raíz del árbol T. cada uno de los cuales es. no tienen sucesores o hijos. excluyendo A raíz. que consta de un A conjunto finito T de nodos y una relación R (paternidad) entre los nodos tal que: C B ‡ Hay un nodo. Tm. G E F D ‡ Los nodos restantes.A.. o sea. un árbol. llamado la A raíz del árbol T. C B . son la C B particionados en m (m u 0) conjuntos disjuntos T1.. a su vez. F D G ‡ A los nodos que no son D raíces E otros subárboles de F se les denomina hojas del árbol T..Definición de Árbol ? Un árbol (tree) es un T. especialmente designado. T2.D. .

(A. E)} . (D. (A. E } ‡ Arcos del Grafo C E A B D R={(A. ‡ Vértices del Grafo N ={ A. C). Grafo con 5 vértices y 6 arcos.A. (C. D. (A. relacionados entre sí por un conjunto R de arcos. A). C). que representa un conjunto finito N de nodos. llamados vértices. B.D. C. D).Grafos Un grafo (en inglés graph) es un T. B).

‡ No existe restricción en la relación que establece un arco.Grafos: Aclaraciones ‡Si el conjunto N es vacío. ‡ Cada arco se representa a través de un par. un nodo puede estar relacionado consigo mismo o con otro nodo. donde cada elemento determina uno de los nodos. o sea. . ‡ Cada arco de un grafo establece una única relación entre dos nodos. el grafo será vacío.

una lista lineal puede ser vista como un grafo donde cada nodo está relacionado con exactamente un nodo distinto de él. todas las estructuras vistas con anterioridad pueden ser consideradas como un grafo. .Observación Dado que no hay restricciones en cuanto a los arcos de un grafo. Ejemplo.

‡ Es irrelevante el sentido de las saetas en los arcos ‡ Al representarlos. para todo j y k. .Clasificación de los Grafos Un grafo es no orientado o no dirigido (en inglés not directed o not oriented graph) si el hecho de que el arco (Nj. Nk) pertenezca a R implica que el arco (Nk. Nj) pertenece a R. Si el grafo es no orientado. al arco se le llama arista. ‡ El arco que los relaciona aparece una sola vez en el conjunto R de arcos del grafo. los arcos se grafican sin saeta.

Clasificación de los Grafos Un grafo es orientado o dirigido (en inglés: oriented graph o directed graph) si el hecho de que el arco (Nj. . para todo j y k. o sea. ‡ El sentido de las saetas en los arcos es importante. ‡ Es importante la dirección del arco. el nodo origen del arco y el nodo destino. Nj) pertenece también a R. ‡ El hecho que exista un arco de Nj a Nk no implica que exista de Nk a Nj. Se conocen como digrafos (en inglés: digraph). Nk) pertenezca a R no implica que el arco (Nk.

Clasificación de los Grafos A C E A C E B D B D Grafo No Orientado o No Dirigido Grafo Orientado o Dirigido .

Adyacencia El nodo n es adyacente al m. Adyacencia: A C E B D ‡ B es adyacente a A ‡ D es adyacente a A ‡ C es adyacente a A ‡ A es adyacente a A ‡ C es adyacente a D ‡ E es adyacente a C . si existe un arco o arista de m a n.

B) ‡ (A. Así.Incidencia El vértice n es incidente al arco o arista x. Del mismo modo.B) es incidente a B . . si n es uno de los vértices relacionados con el arco o arista x. todos los arcos que llegan o salen de un nodo son incidentes a él A C E B D Incidencia: ‡ B es incidente al arco (A. se dice que el arco o arista x es incidente al vértice n.

el grado de un vértice es la suma de los grados de entrada y de salida del vértice.Grado de un Vértice El grado de un vértice n es el número de arcos incidentes a él. En el caso de los grafos orientados. . Por lo tanto. el grado de entrada de un vértice n es el número de arcos que llegan a él y el grado de salida de un vértice n es el número de arcos que salen de él.

Grado de un Vértice Sobre el Nodo D: A D C E F B ‡ Grado de Entrada: 3 ‡ Grado de Salida: 2 ‡ Grado del Nodo: 5 .

también llamados pesos.Ponderando arcos y vértices En muchas aplicaciones resulta de interés asignar valores de ponderación. a los arcos o a los vértices. obteniéndose así: ‡ Grafos ponderados por los arcos ‡ Grafos ponderados por los vértices .

. Se sabe en qué ciudades el agente debe repartir los paquetes. El problema consiste en saber cuál es la mejor ruta a seguir por el agente para repartir todos los paquetes. así como la distancia entre cada ciudad y las otras.Ejemplo: Grafo ponderado por los arcos Problema del agente viajero Un agente necesita repartir paquetes en diferentes ciudades.

Ejemplo: Grafo ponderado por los arcos El problema se puede modelar con un grafo. Si para todas las ciudades se cumple que la distancia entre una ciudad origen y una ciudad destino y la distancia de la ciudad destino a la ciudad origen es la misma. . entonces. ‡ Los caminos entre las ciudades son arcos. donde: ‡ Las ciudades son vértices. Podemos ponderar los arcos con la distancia que existe entre las ciudades. se puede utilizar un grafo no orientado.

Entre las ciudades A y B hay 50 km. B y C.Ejemplo: Grafo ponderado por los arcos El agente debe visitar tres ciudades A. . A 50 Km B C Caminos: A-B-C: 70 Km A-C-B: 35 Km El camino más corto es de A a C y de C a B. entre las ciudades B y C hay 20 km y entre las ciudades A y C hay 15 km. partiendo de la ciudad A.

de forma tal que se realicen primero las de menor duración. ‡ En cada vértice se puede almacenar la duración de la actividad como factor de ponderación. ‡ Las actividades se pueden representar por los vértices de un grafo no orientado. en qué orden debieran realizarse. en un momento dado.Ejemplo: Grafo ponderado por los vértices Se tiene una secuencia de actividades. de las que se conoce su duración y se quiere saber. .

la B. luego la C y. . por último.Ejemplo: Grafo ponderado por los vértices A 10 C 20 B 25 Resulta más conveniente realizar la actividad A.

D. . si existe una secuencia de k+1 nodos n1. En un grafo no orientado.D.A..C) Camino de longitud 2: (A. ni+1) son adyacentes para todo i entre 1 y k. donde n1 = A.C) .A..Camino entre nodos Existe un camino de longitud k desde el nodo A al B.. Caminos entre los nodos A y C: A C E B D Camino de longitud 1: (A.C) Camino de longitud 2: (A.C) Camino de longitud 3: (A. n2. nk+1. al camino se le llama cadena. nk+1 = B y (ni.

B. B. A.Ejemplo: Camino entre nodos ¿Existe un camino de longitud mayor que 1 entre los nodos C y D? A C B D ‡ Camino de longitud 3: (C. A. A. B. B. C. A. B) ‡ Camino de longitud 5: (C. B) . B) ‡ Camino de longitud 4: (C.

B. D) (A.Camino simple Entre dos nodos existe un camino simple si todos los vértices. C) B D . A. son distintos dos a dos. A C Ejemplo: (A. B. O sea. un camino simple es aquel en el que no se repiten los arcos. excepto posiblemente el primero y el último.

Camino simple Un ciclo.C. o también circuito.A B D .A Bucle: A. es un camino simple de cualquier longitud de un nodo a sí mismo. entonces se denomina bucle o lazo. A C E Ejemplo: Ciclo: A.D. Si el ciclo es de longitud 1.

Grafo cíclico y acíclico Si un grafo contiene al menos un ciclo se llama cíclico. A C A B C D E B D Grafo cíclico Grafo acíclico . Un grafo acíclico es aquel que no tiene ningún circuito o ciclo.

‡ Dado un vértice. (Convenio: se crea inicialmente vacío). ‡ Eliminar vértices y arcos. ‡ Insertar vértices y arcos. ‡ Dados dos vértices. ‡ Verificar si un grafo está vacío o no. determinar si son adyacentes.Operaciones sobre Grafos ‡ Construir un grafo dada la información de sus vértices. determinar cuáles vértices son adyacentes a él. .

‡ Determinar si el grafo es cíclico. ‡ Dado un arco. determinar un camino de longitud k entre ellos.Operaciones sobre Grafos ‡ Dados dos vértices. . determinar vértices incidentes a él.

‡ Esto significa que la representación matricial es una representación secuencial. .Representación matricial de Grafos ‡ La representación matricial permite establecer si hay relación entre cada vértice del grafo y los demás. se utiliza una matriz cuadrada. ‡ Para ello. ‡ Se utiliza un arreglo bidimensional.

Representación matricial de Grafos B C E A partir de un grafo. siempre es posible definir un orden arbitrario de los nodos. A 0 B 1 C 2 D 3 E 4 A D .

. ‡ Cada fila y cada columna de la matriz se corresponde con un vértice en particular.Matriz de Adyacencia La matriz de adyacencia representa para cada nodo cuáles son sus vértices adyacentes. j) es verdadero. si el elemento (i. j) es falso. si existe el arco del vértice i al vértice j existe el arco del vértice j al vértice i. no existe arco del vértice i al vértice j. existe un arco que va del vértice i al vértice j y. ‡ Los elementos de la matriz son booleanos ‡ Si el elemento (i. ‡ Si el grafo es no orientado.

Representación matricial de Grafos Vértices B C A A 0 D E 0 1 2 3 4 0 0 0 0 0 0 B 1 1 0 0 0 0 0 C 2 2 1 1 0 0 0 D 3 3 1 0 1 0 1 E 4 4 0 0 1 1 0 Matriz de Adyacencia .

public: TVertex(void* pInfo) : aInfo(pInfo){} void* Info(){return aInfo.Implementación en C++ class TVertex { private: void* aInfo. .} }.

int Degree(int). . bool Cyclic(). bool aDirected. public: TSeqGraph(int. ~TSeqGraph(). « }. TGSeqList* Adjacents(int). TGSeqList* aVertexList.Implementación en C++ class TSeqGraph { private: bool** aAdjacent. int). bool AreAdjacents(int. int aOrder. bool).

int. bool InsertVertex(void*). bool IsEdge(int. int).} TGSeqList* VertexList(){return aVertexList. int). int Order() {return aOrder.} bool Empty(){return aVertexList->Empty(). int). int). bool DeleteVertex(int). bool IsPathWithLength(int.} bool InsertEdge(int.} }. .Implementación en C++ class TSeqGraph { public: « bool DeleteEdge(int. bool Directed() {return aDirected.

Problemas La representación de la matriz de adyacencia de un grafo exige conocer por adelantado la cantidad de nodos del grafo. Esto implica crear la matriz cada vez que se inserte o elimine un nuevo nodo. Problema: Solución costosa en tiempo y recursos. Esta representación no es suficientemente flexible cuando la cantidad de vértices varía con relativa frecuencia o cuando la estructura del grafo cambia durante la ejecución de la aplicación que lo usa. .

.Representación enlazada de Grafos Problemas A B Variante 1: ‡ Es difícil saber cuántos arcos llegan a un nodo C Una lista de vértices y cada uno tiene ‡ Se repite los vértices adyacentes a él. una lista de la información del vértice A B C D E C C D E D E D D E ‡ Las listas pueden ser indistintamente secuenciales o enlazadas o una combinación. ‡ El grafo está vacío si no existen vértices.

Representación enlazada de Grafos Variante 2: Representación multienlazada ‡ Cada vértice se representa a través de un nodo que contiene: ‡ Apuntador a su información. ‡ Apuntador a una lista de arcos ‡ Apuntador al siguiente vértice en la lista ‡Cada arco se representa por un nodo que contiene: ‡ Apuntador al próximo arco de su vértice origen ‡ Apuntador al nodo de su vértice destino .

Representación enlazada de Grafos Variante 2: Representación multienlazada ‡ El grafo está vacío si no hay vértices. B C A B C D E E A D .

. se puede eliminar ese vértice si la lista de arcos está vacía.Representación enlazada de Grafos Contador de referencia formar parte de la información de los vértices y mantiene actualizado la cantidad de arcos llegan a él. Si el contador del vértice adyacente se hace cero. ‡ Los contadores de referencia facilitan algunas operaciones del grafo: ‡ Al eliminar un vértice se deben decrementar los contadores de referencia de los vértices adyacentes.

Implementación en C++ La representación multienlazada de grafos debe considerar si el grafo es ponderado por los vértices o por los arcos. En estos casos habría que agregar a los nodos de vértices y arcos respectivamente el peso o factor de ponderación. .

} void* Info() {return aInfo.} }.} TGLinkedList* EdgeList(){return aEdgeList. TGLinkedList* aEdgeList.Representación enlazada de Grafos class TVertex { private: void* aInfo.} void Info(void* pInfo) {aInfo = pInfo. public: TVertex(void* pInfo) : aInfo(pInfo) {aEdgeList = new TGLinkedList(). .

} TVertex* Vertex(){return aVertex. public: TEdge(TVertex* pVertex){aVertex = pVertex.} }.Implementación en C++ class TEdge { private: TVertex* aVertex.} void Vertex(TVertex* pVertex) {aVertex = pVertex. .

~TLinkedGraph(). int Degree(int). . « }.Implementación en C++ class TLinkedGraph { private: bool aDirected. int). public: TLinkedGraph(bool pDirected). bool Cyclic(). TGLinkedList* aVerticesList. bool AreAdjacents(int. TGLinkedList* Adjacents(int).

int). TSEdge* IsEdge (int. bool Path(int. . }. int. int OutDegree(int).} bool Empty(){return aVertexList>Empty(). int). int). bool PathWithLength (int. bool InsertEdge(int. bool InsertVertex(void*). TGLinkedList* VerticesList(). TVertex* DeleteVertex(int).} int InDegree(int).Implementación en C++ class TLinkedGraph { « bool DeleteEdge(int. int. bool Directed (){return aDirected. int). int).

2 Insertarlos. ‡ Insertar un arco en la lista de arcos de V1 y poner su apuntador al vértice adyacente apuntando al nodo que contiene a V2 en la lista de vértices.Inserción en grafos multienlazados Inserción un arco de V1 a V2: 1-Verificar la existencia de los vértices V1 y V2 2-Hay dos posibilidades: 2. el contador de referencia del vértice V2. no se puede insertar el arco. ‡ Si tiene contador de referencia incrementar en 1. .1 De no existir uno o ninguno. 2.

Eliminación en grafos multienlazados Eliminar el vértice V: 1-Verificar la existencia del vértice V. 2-Para cada arco de V: -Si en el vértice apuntado por ese arco hay contador de referencia. decrementarlo en uno y si éste toma el valor cero. para eliminarlo. . verificar si la lista de arcos está vacía. -Eliminar el arco.

analizar de acuerdo a la política si se elimina o no. 4-Eliminar el nodo vértice V. 5-Devolver la información del vértice V.Eliminación en grafos multienlazados Eliminar el vértice V: 3-Para cada Vértice excepto V -Buscar si existe algún arco que apunte a V -i existe eliminarlo y si la lista queda vacía. verificar el contador de referencia y si es cero. .

Sign up to vote on this title
UsefulNot useful