You are on page 1of 52

Diplomado en Informtica Aplicada

Asignatura: Estructura de Datos Avanzada


Tema: Grafos

Centro de Estudio de Ingeniera de Sistemas (CEIS)


Instituto Superior Politcnico Jos Antonio Echeverra (CUJAE)

Tema 4: Grafos
Contenido
Definicin de grafo.
Operaciones sobre grafos.
Representacin matricial de grafos en un lenguaje
de programacin.
Grafos (representacin enlazada)
Operaciones sobre grafos representados de
manera enlazada.
Representacin enlazada de grafos en un
lenguaje de programacin

io
l
b
Bi

f
a
r
g

Bibliografa

Data Structures / Algorithms in Java. Robert Lafore.


Pginas: 280-370

Thinking in Java. Pginas: 395-445.


Aprenda Java como si estuviera en primero.
Pginas: 135-139.
Aprenda Java en 21 das. Pginas: 135-151.
El C++. Lenguaje de Programacin. Bjarne
Stroustrup. Pginas 143-180 :.

Objetivos
Conozcan las estructuras de datos arbreas y las
formas de trabajar con ellas en la solucin de
problemas de mediana complejidad

Introduccin
Estructuras de datos estudiadas:
Listas lineales y sus variantes.
Las relaciones entre los nodos de informacin 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.

Introduccin
Estructuras de datos estudiadas:
Los rboles y sus variantes
Cuando se est en presencia de relaciones no
lineales de tipo jerrquica, se utilizan los rboles.
Un nodo puede tener ms de un sucesor.
Se puede establecer un camino nico desde el
nodo raz hasta un nodo cualquiera del rbol.
Cada nodo tiene un nico padre, exceptuando al
nodo raz del rbol, que no tiene padre.

Introduccin
En ocasiones, incluso, se requiere tener acceso a un
nodo determinado a partir de ms de un nodo de la
estructura. Existen varios caminos entre un nodo y
otro.
Ejemplo:
Una red hidrulica,
Caminos entre ciudades,
Afinidad entre miembros de un colectivo, entre
otros.

Introduccin

Ciudad B
Ciudad A
Ciudad F

Ciudad D

Ciudad C
Ciudad E

Caminos entre ciudades

Definicin de rbol
? rbol (tree) es un T.D.A. que consta
Un
de un
A
conjunto finito T de nodos y una relacin R
(paternidad) entre los nodos tal que:
C
B

Hay un nodo, especialmente designado, llamado la


A
raz del rbol T.
G
E
F
D
Los nodos restantes, excluyendo A
la raz, son
C
B
particionados en m (m 0) conjuntos disjuntos T1,
C vez, un
B
T2, ..., Tm, cada uno de los cuales
es, a su
E
rbol, llamado
subrbol
F de laGraz del rbol T.
D
G
A los nodos que no son D
F subrboles
races E
de otros
se les denomina hojas del rbol T, o sea, no tienen
sucesores o hijos.

Grafos
Un grafo (en ingls graph) es un T.D.A. que
representa un conjunto finito N de nodos, llamados
vrtices, relacionados entre s por un conjunto R de
arcos.
Grafo con 5 vrtices y 6 arcos.

Vrtices del Grafo


N ={ A, B, C, D, E }
Arcos del Grafo

C
E

R={(A, A), (A, B), (A, D), (A, C), (D, C), (C, E)}

Grafos: Aclaraciones
Si el conjunto N es vaco, el grafo ser vaco.
Cada arco de un grafo establece una nica relacin
entre dos nodos.
No existe restriccin en la relacin que establece un
arco, o sea, un nodo puede estar relacionado
consigo mismo o con otro nodo.
Cada arco se representa a travs de un par, donde
cada elemento determina uno de los nodos.

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

Clasificacin de los Grafos


Un grafo es no orientado o no dirigido (en ingls
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, para todo j y k.
Es irrelevante el sentido de las saetas en los arcos
Al representarlos, los arcos se grafican sin saeta.
El arco que los relaciona aparece una sola vez en
el conjunto R de arcos del grafo.
Si el grafo es no orientado, al arco se le llama arista.

Clasificacin de los Grafos


Un grafo es orientado o dirigido (en ingls:
oriented graph o directed graph) si el hecho de
que el arco (Nj, Nk) pertenezca a R no implica que el
arco (Nk, Nj) pertenece tambin a R, para todo j y k.
El sentido de las saetas en los arcos es importante.
Es importante la direccin del arco, o sea, el nodo
origen del arco y el nodo destino.
El hecho que exista un arco de Nj a Nk no implica
que exista de Nk a Nj.
Se conocen como digrafos (en ingls: digraph).

Clasificacin de los Grafos


A

C
E

Grafo No Orientado
o No Dirigido

C
E

Grafo Orientado o
Dirigido

Adyacencia
El nodo n es adyacente al m, si existe un arco o
arista de m a n.
Adyacencia:
A

B es adyacente a A
D es adyacente a A

C
E

C es adyacente a A
A es adyacente a A
C es adyacente a D
E es adyacente a C

Incidencia
El vrtice n es incidente al arco o arista x, si n es
uno de los vrtices relacionados con el arco o arista
x. Del mismo modo, se dice que el arco o arista x es
incidente al vrtice n.
.
As, todos los arcos que llegan o salen de un nodo
son incidentes a l
A

C
E

Incidencia:
B es incidente al arco (A,B)
(A,B) es incidente a B

Grado de un Vrtice
El grado de un vrtice n es el nmero de arcos
incidentes a l.
En el caso de los grafos orientados, el grado de
entrada de un vrtice n es el nmero de arcos que
llegan a l y el grado de salida de un vrtice n es el
nmero de arcos que salen de l.
Por lo tanto, el grado de un vrtice es la suma de
los grados de entrada y de salida del vrtice.

Grado de un Vrtice
Sobre el Nodo D:

B
D

F
E

Grado de Entrada: 3
Grado de Salida: 2
Grado del Nodo: 5

Ponderando arcos y vrtices


En muchas aplicaciones resulta de inters asignar
valores de ponderacin, tambin llamados pesos,
a los arcos o a los vrtices, obtenindose as:
Grafos ponderados por los arcos
Grafos ponderados por los vrtices

Ejemplo: Grafo ponderado por los arcos


Problema del agente viajero
Un agente necesita repartir paquetes en diferentes
ciudades. Se sabe en qu ciudades el agente debe
repartir los paquetes, as como la distancia entre
cada ciudad y las otras.
El problema consiste en saber cul es la mejor ruta a
seguir por el agente para repartir todos los paquetes.

Ejemplo: Grafo ponderado por los arcos


El problema se puede modelar con un grafo, donde:
Las ciudades son vrtices.
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, entonces, se puede utilizar un
grafo no orientado.
Podemos ponderar los arcos con la distancia que
existe entre las ciudades.

Ejemplo: Grafo ponderado por los arcos


El agente debe visitar tres ciudades A, B y C,
partiendo de la ciudad A. Entre las ciudades A y B
hay 50 km, entre las ciudades B y C hay 20 km y
entre las ciudades A y C hay 15 km.
50 Km

A
15

20 K

B
m

Caminos:
A-B-C: 70 Km
A-C-B: 35 Km

El camino ms corto es de A a C y de C a B.

Ejemplo: Grafo ponderado por los vrtices


Se tiene una secuencia de actividades, de las que se
conoce su duracin y se quiere saber, en un
momento dado, en qu orden debieran realizarse, de
forma tal que se realicen primero las de menor
duracin.
Las actividades se pueden representar por los
vrtices de un grafo no orientado.
En cada vrtice se puede almacenar la duracin de
la actividad como factor de ponderacin.

Ejemplo: Grafo ponderado por los vrtices

10

25
C
20

Resulta ms conveniente realizar la actividad A,


luego la C y, por ltimo, la B.

Camino entre nodos


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

Camino de longitud 1: (A,C)


Camino de longitud 2: (A,D,C)

C
E

Camino de longitud 2: (A,A,C)


Camino de longitud 3: (A,A,D,C)

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, A, B)


Camino de longitud 4: (C, B, A, C, B)
Camino de longitud 5: (C, B, A, B, A, B)

Camino simple
Entre dos nodos existe un camino simple si todos
los vrtices, excepto posiblemente el primero y el
ltimo, son distintos dos a dos.
O sea, un camino simple es aquel en el que no se
repiten los arcos.
A
C

B
D

Ejemplo:
(A, B, D)
(A, B, A, C)

Camino simple
Un ciclo, o tambin circuito, es un camino simple
de cualquier longitud de un nodo a s mismo. Si el
ciclo es de longitud 1, entonces se denomina bucle o
lazo.
A

C
E

Ejemplo:
Ciclo: A,D,C,A
Bucle: A,A

Grafo cclico y acclico


Si un grafo contiene al menos un ciclo se llama
cclico.
Un grafo acclico es aquel que no tiene ningn
circuito o ciclo.
A
C

C
D

Grafo cclico

Grafo acclico

Operaciones sobre Grafos


Construir un grafo dada la informacin de sus
vrtices. (Convenio: se crea inicialmente vaco).
Verificar si un grafo est vaco o no.
Insertar vrtices y arcos.
Eliminar vrtices y arcos.
Dados dos vrtices, determinar si son adyacentes.
Dado un vrtice, determinar cules vrtices son
adyacentes a l.

Operaciones sobre Grafos


Dados dos vrtices, determinar un camino de
longitud k entre ellos.
Dado un arco, determinar vrtices incidentes a l.
Determinar si el grafo es cclico.

Representacin matricial de Grafos


La representacin matricial permite establecer si
hay relacin entre cada vrtice del grafo y los
dems.
Para ello, se utiliza una matriz cuadrada.
Se utiliza un arreglo bidimensional.
Esto significa que la representacin matricial es
una representacin secuencial.

Representacin matricial de Grafos


A

B
C

D
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

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

Representacin matricial de Grafos


Vrtices

A
0

B
1

C
2

D
3

0
0

1
0

2
1

3
1

4
0

Matriz de Adyacencia 2

B
C

D
E

E
4

Implementacin en C++
class TVertex
{
private:
void* aInfo;
public:
TVertex(void* pInfo) : aInfo(pInfo){}
void* Info(){return aInfo;}
};

Implementacin en C++
class TSeqGraph
{
private:
bool** aAdjacent;
bool aDirected;
int aOrder;
TGSeqList* aVertexList;
public:
TSeqGraph(int, bool);
~TSeqGraph();
TGSeqList* Adjacents(int);
bool AreAdjacents(int, int);
bool Cyclic();
int Degree(int);
};

Implementacin en C++
class TSeqGraph
{
public:

bool DeleteEdge(int, int);


bool DeleteVertex(int);
bool Directed() {return aDirected;}
bool Empty(){return aVertexList->Empty();}
bool InsertEdge(int, int);
bool InsertVertex(void*);
bool IsEdge(int, int);
bool IsPathWithLength(int, int, int);
int Order() {return aOrder;}
TGSeqList* VertexList(){return aVertexList;}
};

Problemas
La representacin de la matriz de adyacencia de
un grafo exige conocer por adelantado la cantidad
de nodos del grafo.
Esta representacin no es suficientemente flexible
cuando la cantidad de vrtices vara con relativa
frecuencia o cuando la estructura del grafo cambia
durante la ejecucin de la aplicacin que lo usa.
Esto implica crear la matriz cada vez que se inserte
o elimine un nuevo nodo.
Problema: Solucin costosa en tiempo y recursos.

Representacin enlazada de Grafos


Problemas
A
B
Variante
1: saber cuntos arcos
Es difcil
llegan
unvrtices
nodo y cada uno tiene
C
Una
listaade
Se
repite
la informacin
del
una
lista
de los
vrtices adyacentes
a l.
vrtice
A
B
C
D
E

C
D
E
D

D
E

Las listas pueden ser


indistintamente secuenciales o
enlazadas o una combinacin.
El grafo est vaco si no
existen vrtices.

Representacin enlazada de Grafos


Variante 2: Representacin multienlazada
Cada vrtice se representa a travs de un nodo que
contiene:
Apuntador a su informacin,
Apuntador a una lista de arcos
Apuntador al siguiente vrtice en la lista
Cada arco se representa por un nodo que contiene:
Apuntador al prximo arco de su vrtice origen
Apuntador al nodo de su vrtice destino

Representacin enlazada de Grafos


Variante 2: Representacin multienlazada
El grafo est vaco si no hay
vrtices.

B
C

D
E

Representacin enlazada de Grafos


Contador de referencia formar parte de la
informacin de los vrtices y mantiene actualizado
la cantidad de arcos llegan a l.
Los contadores de referencia facilitan algunas
operaciones del grafo:
Al eliminar un vrtice se deben decrementar los
contadores de referencia de los vrtices adyacentes.
Si el contador del vrtice adyacente se hace cero, se
puede eliminar ese vrtice si la lista de arcos est
vaca.

Implementacin en C++
La representacin multienlazada de grafos debe
considerar si el grafo es ponderado por los
vrtices o por los arcos.
En estos casos habra que agregar a los nodos de
vrtices y arcos respectivamente el peso o factor
de ponderacin.

Representacin enlazada de Grafos


class TVertex
{
private:
void* aInfo;
TGLinkedList* aEdgeList;
public:
TVertex(void* pInfo) : aInfo(pInfo)
{aEdgeList = new TGLinkedList();}
void* Info() {return aInfo;}
void Info(void* pInfo) {aInfo = pInfo;}
TGLinkedList* EdgeList(){return
aEdgeList;}
};

Implementacin en C++
class TEdge
{
private:
TVertex* aVertex;
public:
TEdge(TVertex* pVertex){aVertex =
pVertex;}
TVertex* Vertex(){return aVertex;}
void Vertex(TVertex* pVertex)
{aVertex = pVertex;}
};

Implementacin en C++
class TLinkedGraph
{
private:
bool aDirected;
TGLinkedList* aVerticesList;
public:
TLinkedGraph(bool pDirected);
~TLinkedGraph();
TGLinkedList* Adjacents(int);
bool AreAdjacents(int, int);
bool Cyclic();
int Degree(int);

};

Implementacin en C++
class TLinkedGraph
{

bool DeleteEdge(int, int);


TVertex* DeleteVertex(int);
bool Directed (){return aDirected;}
bool Empty(){return aVertexList>Empty();}
int InDegree(int);
bool InsertEdge(int, int);
bool InsertVertex(void*);
TSEdge* IsEdge (int, int);
int OutDegree(int);
bool Path(int, int, int);
bool PathWithLength (int, int, int);
TGLinkedList* VerticesList();

Insercin en grafos multienlazados


Insercin un arco de V1 a V2:
1-Verificar la existencia de los vrtices V1 y V2
2-Hay dos posibilidades:
2.1 De no existir uno o ninguno, no se
puede
insertar el arco.
2.2 Insertarlos.
Insertar un arco en la lista de arcos de V1 y
poner su apuntador al vrtice adyacente
apuntando al nodo que contiene a V2 en la lista
de vrtices.
Si tiene contador de referencia incrementar en 1,

Eliminacin en grafos multienlazados


Eliminar el vrtice V:
1-Verificar la existencia del vrtice V.
2-Para cada arco de V:
-Si en el vrtice apuntado por ese arco hay
contador de referencia, decrementarlo en uno y
si
ste toma el valor cero, verificar si la lista de
arcos
est vaca, para eliminarlo.
-Eliminar el arco.

Eliminacin en grafos multienlazados


Eliminar el vrtice V:
3-Para cada Vrtice excepto V
-Buscar si existe algn arco que apunte a V
-i existe eliminarlo y si la lista queda vaca,
verificar el contador de referencia y si es cero,
analizar de acuerdo a la poltica si se elimina o
no.
4-Eliminar el nodo vrtice V.
5-Devolver la informacin del vrtice V.

You might also like