P. 1
Grafos

Grafos

|Views: 383|Likes:
Publicado porisakku

More info:

Published by: isakku on Sep 09, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PPT, PDF, TXT or read online from Scribd
See more
See less

01/27/2013

pdf

text

original

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.

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

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

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.A. a su vez. 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. T2. Tm.D. un árbol. no tienen sucesores o hijos..Definición de Árbol ? Un árbol (tree) es un T. excluyendo A raíz... C B . especialmente designado. cada uno de los cuales es. o sea. . llamado la A raíz del árbol T. 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. son la C B particionados en m (m u 0) conjuntos disjuntos T1. G E F D ‡ Los nodos restantes.

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

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

Ejemplo. 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. . una lista lineal puede ser vista como un grafo donde cada nodo está relacionado con exactamente un nodo distinto de él.

para todo j y k. ‡ El arco que los relaciona aparece una sola vez en el conjunto R de arcos del grafo. Nk) pertenezca a R implica que el arco (Nk. al arco se le llama arista.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. Si el grafo es no orientado. los arcos se grafican sin saeta. . Nj) pertenece a R. ‡ Es irrelevante el sentido de las saetas en los arcos ‡ Al representarlos.

para todo j y k. ‡ El hecho que exista un arco de Nj a Nk no implica que exista de Nk a Nj. ‡ El sentido de las saetas en los arcos es importante. Nj) pertenece también a R.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. el nodo origen del arco y el nodo destino. o sea. Se conocen como digrafos (en inglés: digraph). ‡ Es importante la dirección del arco. . 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 .

si existe un arco o arista de m a n.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 .

. Del mismo modo.B) es incidente a B .B) ‡ (A.Incidencia El vértice n es incidente al arco o arista x. si n es uno de los vértices relacionados con el arco o arista x. Así. se dice que el arco o arista x es incidente al vértice n. 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.

En el caso de los grafos orientados.Grado de un Vértice El grado de un vértice n es el número de arcos incidentes a él. 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. 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 Sobre el Nodo D: A D C E F B ‡ Grado de Entrada: 3 ‡ Grado de Salida: 2 ‡ Grado del Nodo: 5 .

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

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. El problema consiste en saber cuál es la mejor ruta a seguir por el agente para repartir todos los paquetes. . Se sabe en qué ciudades el agente debe repartir los paquetes.

Podemos ponderar los arcos con la distancia que existe entre las ciudades. . entonces. ‡ Los caminos entre las ciudades son arcos. 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.Ejemplo: Grafo ponderado por los arcos El problema se puede modelar con un grafo. se puede utilizar un grafo no orientado. donde: ‡ Las ciudades son vértices.

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. Entre las ciudades A y B hay 50 km. partiendo de la ciudad A. .Ejemplo: Grafo ponderado por los arcos El agente debe visitar tres ciudades A. B y C.

de las que se conoce su duración y se quiere saber. 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. . en qué orden debieran realizarse. ‡ Las actividades se pueden representar por los vértices de un grafo no orientado.Ejemplo: Grafo ponderado por los vértices Se tiene una secuencia de actividades. en un momento dado.

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

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

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. B. B. B. A. A. B) ‡ Camino de longitud 5: (C. B) . C. A. B) ‡ Camino de longitud 4: (C.

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

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

Un grafo acíclico es aquel que no tiene ningún circuito o ciclo.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 .

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

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

se utiliza una matriz cuadrada. . ‡ Para ello.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 un arreglo bidimensional. ‡ Esto significa que la representación matricial es una representación secuencial.

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

no existe arco del vértice i al vértice j. ‡ Los elementos de la matriz son booleanos ‡ Si el elemento (i. ‡ Si el grafo es no orientado. . j) es falso. existe un arco que va del vértice i al vértice j y. si el elemento (i. ‡ 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. si existe el arco del vértice i al vértice j existe el arco del vértice j al vértice i. j) es verdadero.

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 .

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

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

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

Problema: Solución costosa en tiempo y recursos. .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. 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.

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 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.

‡ 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 ‡ Cada vértice se representa a través de un nodo que contiene: ‡ Apuntador a su información.

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

Si el contador del vértice adyacente se hace cero. 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. ‡ 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.

En estos casos habría que agregar a los nodos de vértices y arcos respectivamente el peso o factor de ponderación. .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.

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

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

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

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

1 De no existir uno o ninguno. 2.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. ‡ Si tiene contador de referencia incrementar en 1. no se puede insertar el arco. ‡ 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.2 Insertarlos.

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

. 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. 4-Eliminar el nodo vértice V. verificar el contador de referencia y si es cero. analizar de acuerdo a la política si se elimina o no.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->