Professional Documents
Culture Documents
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
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
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
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.
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.
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
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.
10
25
C
20
C
E
B
D
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
C
D
Grafo cclico
Grafo acclico
B
C
D
E
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.
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:
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.
C
D
E
D
D
E
B
C
D
E
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.
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
{