Vous êtes sur la page 1sur 20

Teoria de grafos

El origen de la palabra grafo es griego y su significado etimolgico es "trazar".


Aparece con gran frecuencia como respuesta a problemas de la vida
cotidiana,algunos ejemplos podran ser los siguientes:un grfico de una serie de
tareas a realizar indicando su secuenciacin (un organigrama),grafos matemticos
que representan las relaciones binarias,una red de carreteras,la red de enlaces
ferroviarios o areos o la red elctrica de una ciudad.(Vase la figura 1).En cada
caso,es conveniente representar grficamente el problema dibujando un grafo
como un conjunto de puntos(vrtices)con lneas conectndolos (arcos).

De aqu se podra deducir que un grafo es bsicamente un objeto geomtrico


aunque en realidad sea un objeto combinatorio,es decir,un conjunto de puntos y
un conjunto de lneas tomado de entre el conjunto de lneas que une cada par de
vrtices.Por otro lado,y debido a su generalidad y a la gran diversidad de formas
que pueden usarse,resulta complejo tratar con todas las ideas relacionadas con un
grafo.
Para facilitar el estudio de este tipo de dato,a continuacin se realizar un estudio
de la teora de grafos desde el punto de vista de las ciencias de la computacin.
Considerando que dicha teora es compleja y amplia,aqu slo se realizar una
introduccin a la misma,describindose el grafo como un tipo de dato y

mostrndose los problemas tpicos y los algoritmos que permiten solucionarlos


usando un ordenador.
Los grafos son estructuras de datos no lineales que tienen una naturaleza
generalmente dinmica. Su estudio podra dividirse en dos grandes bloques:
Grafos Dirigidos.
Grafos no Dirigidos(pueden ser considerados un caso particular de los
anteriores).
Un ejemplo de grafo dirigido lo constituye la red de aguas de una ciudad ya que
cada tubera slo admite que el agua la recorra en un nico sentido.Por el
contrario,la red de carreteras de un pas representa en general un grafo no
dirigido,puesto que una misma carretera puede ser recorrida en ambos
sentidos.No obstante,podemos dar unas definiciones generales para ambos tipos.
A continuacin daremos definiciones de los dos tipos de grafos y de los
conceptos que llevan asociados.

2. DEFINICIONES Y TERMINOLOGA
FUNDAMENTAL.
Un grafo G es un conjunto en el que hay definida una relacin binaria,es
decir,G=(V,A) tal que V es un conjunto de objetos a los que denominaremos
vrtices o nodos y
es una relacin binaria a cuyos elementos
denominaremos arcos o aristas.
Dados

,puede ocurrir que:

1.

, en cuyo caso diremos que x e y estn unidos mediante un arco,y

2.

, en cuyo caso diremos que no lo estn.

Si las aristas tienen asociada una direccin(las aristas (x,y) y (y,x) no son
equivalentes) diremos que el grafo es dirigido,en otro caso ((x,y)=(y,x)) diremos
que el grafo es no dirigido.

Conceptos asociados a grafos:


Diremos que un grafo es completo si A=VxV,o sea,si para cualquier pareja
de vrtices existe una arista que los une(en ambos sentidos si el grafo es no
dirigido).El nmero de aristas ser:
o grafos dirigidos:

o grafos no dirigidos:

donde n=|V|

Un grafo dirigido es simtrico si para toda arista (x,y)perteneciente a


A tambin aparece la arista (y,x)perteneciente a A;y es antisimtrico si
dada una arista (x,y) perteneciente a A implica que (y,x) no pertenece a A.

Tanto a las aristas como a los vrtices les puede ser asociada
informacin.A esta informacin se le llama etiqueta.Si la etiqueta que se
asocia es un nmero se le llama peso,costo o longitud.Un grafo cuyas
aristas o vrtices tienen pesos asociados recibe el nombre de grafo
etiquetado o ponderado.

El nmero de elementos de V se denomina orden del grafo.Un grafo


nulo es un grafo de orden cero.

Se dice que un vrtice x es incidente a un vrtice y si existe un arco que


vaya de x a y ((x,y)pertenece a A),a x se le denomina origen del arco y
a y extremo del mismo.De igual forma se dir que y es adyacente a x.En el
caso de que el grafo sea no dirigido si x es adyacente(resp. incidente)
a y entonces y tambin es adyacente (resp. incidente) a x.

Se dice que dos arcos son adyacentes cuando tienen un vrtice comn que
es a la vez origen de uno y extremo del otro.

Se denomina camino (algunos autores lo llaman cadena si se trata de un


grafo no dirigido)en un grafo dirigido a una sucesin de arcos adyacentes:
C={(v1,v2),(v2,v3),...,(vn-1,vn), para todo vi perteneciente a V}

La longitud del camino es el nmero de arcos que comprende y en el caso


en el que el grafo sea ponderado se calcular como la suma de los pesos de
las aristas que lo constituyen.
Ejemplo.
o En el grafo dirigido de la figura 2,un camino que une los vrtices 1
y 4 es C= {(1,3),(3,2),(2,1)},su longitud es 3.

o En el grafo no dirigido de la figura 2,un camino que une los vrtices


1 y 4 es C'= {(1,2),(2,4)}.Su longitud es 2.

Un camino se dice simple cuando todos sus arcos son distintos y se


dice elemental cuando no utiliza un mismo vrtice dos veces.Por tanto
todo camino elemental es simple y el recproco no es cierto.

Un camino se dice Euleriano si es simple y adems contiene a todos los


arcos del grafo.

Un circuito(o ciclo para grafos no dirigidos)es un camino en el que


coinciden los vrtices inicial y final.Un circuito se dice simple cuando
todos los arcos que lo forman son distintos y se dice elemental cuando
todos los vrtices por los que pasa son distintos.La longitud de un circuito
es el nmero de arcos que lo componen.Un bucle es un circuito de
longitud 1(estn permitidos los arcos de la forma(i,i) y notemos que un
grafo antisimtrico carecera de ellos).

Un circuito elemental que incluye a todos los vrtices de un grafo lo


llamaremos circuito Hamiltoniano.

Un grafo se denomina simple si no tiene bucles y no existe ms que un


camino para unir dos nodos.

Diremos que un grafo no dirigido es bipartido si el conjunto de sus


vrtices puede ser dividido en dos subconjuntos(disjuntos) de tal forma
que cualquiera de las aristas que componen el grafo tiene cada uno de sus
extremos en un subconjunto distinto.Un grafo no dirigido ser bipartido si
y slo si no contiene ciclos con un nmero de aristas par.

Dado un grafo G=(V,A),diremos que G'=(V,A') con


es un grafo
'
' '
parcial de G y un subgrafo de G es todo grafo G =(V ,A ) con
y
donde A' ser el conjunto de todas aquellas aristas que unan en el
grafo G dos vrtices que estn en V'. Se podran combinar ambas
definiciones dando lugar a lo que llamaremos subgrafo parcial

Se denomina grado de entrada de un vrtice x al nmero de arcos


incidentes en l.Se denota

Se denomina grado de salida de un vrtice x al nmero de arcos


adyacentes a l.Se denota

Para grafos no dirigidos tanto el grado de entrada como el de salida


coinciden y hablamos entonces de grado y lo notamos por

A todo grafo no dirigido se puede asociar un grafo


denominado dual construido de la siguiente forma:

donde A' est construido de la siguiente forma:si e1,e2 pertenece a A son


adyacentes --> (e1,e2)pertenece a A' con e1,e2 pertenece a V'.En
definitiva,para construir un grafo dual se cambian vrtices por aristas y
viceversa.

Dado un grafo G,diremos que dos vrtices estn conectados si entre


ambos existe un camino que los une.

Llamaremos componente conexa a un conjunto de vrtices de un grafo tal


que entre cada par de vrtices hay al menos un camino y si se aade algn
otro vrtice esta concicin deja de verificarse.Matemticamente se puede
ver como que la conexin es una relacin de equivalencia que descompone
a V en clases de equivalencia,cada uno de los subgrafos a los que da lugar
cada una de esas clases de equivalencia constituira una componente
conexa.Un grafo diremos que es conexo si slo existe una componente
conexa que coincide con todo el grafo.
.

3. TDA GRAFO.
A la hora de disear el TDA grafo hay que tener en cuenta que hay que manejar
datos correspondientes a sus vrtices y aristas,pudiendo cada uno de ellos estar o
no etiquetados.Adems hay que proporcionar operaciones primitivas que
permitan manejar el tipo de dato sin necesidad de conocer la
implementacin.As,los tipos de datos que se usarn y las operaciones primitivas
consideradas son las siguientes:
NUEVOS TIPOS APORTADOS.
Los nuevos tipos aportados por el TDA grafo son los siguientes:
grafo.
vertice.
arista.

4. REPRESENTACIONES PARA EL TDA GRAFO.


Existen diversas representaciones de naturaleza muy diferente que resultan
adecuadas para manejar un grafo,y en la mayora de los casos no se puede decir
que una sea mejor que otra siempre ya que cada una puede resultar ms adecuada
dependiendo del problema concreto al que se desea aplicar.As,si existe una
representacin que es peor que otra para todas las operaciones excepto una es
posible que an as nos decantemos por la primera porque precisamente esa
operacin es la nica en la que tenemos especial inters en que se realice de
forma eficiente.A continuacin veremos dos de las representaciones ms
usuales:Matriz de adyacencia(o booleana) y Lista de adyacencia.
MATRIZ DE ADYACENCIA.

Grafos dirigidos.

G=(V,A) un grafo dirigido con |V|=n .Se define la matriz de adyacencia o


booleana asociada a G como Bnxn con

Como se ve,se asocia cada fila y cada columna a un vrtice y los elementos bi,j de
la matriz son 1 si existe el arco (i,j) y 0 en caso contrario.
Grafos no dirigidos.
G=(V,A) un grafo no dirigido con |V|=n .Se define la matriz de adyacencia o
booleana asociada a G como Bnxn con:

La matriz B es simetrica con 1 en las posiciones ij y ji si existe la arista (i,j).


EJEMPLO:

Si el grafo es etiquetado,entonces tanto bi,j como bi,j representan al coste o valor


asociado al arco (i,j) y se suelen denominar matrices de coste. Si el arco (i,j) no
pertenece a A entonces se asigna bi,j o bi,j un valor que no puede ser utilizado
como una etiqueta valida.
La principal ventaja de la matriz de adyacencia es que el orden de eficiencia de
las operaciones de obtencion de etiqueta de un arco o ver si dos vertices estan
conectados son independientes del nmero de vrtices y de arcos. Por el
contrario, existen dos grandes inconvenientes:
Es una representacin orientada hacia grafos que no modifica el nmero
de sus vertices ya que una matriz no permite que se le o supriman filas o
columnas.
Se puede producir un gran derroche de memoria en grafos poco densos
(con gran nmero de vrtices y escaso nmero de arcos).
Para evitar estos inconvenientes se introduce otra representacin: las listas de
adyacencia.
LISTAS DE ADYACENCIA.
En esta estructura de datos la idea es asociar a cada vertice i del grafo una lista
que contenga todos aquellos vrtices j que sean adyacentes a l. De esta forma
sllo reservar memoria para los arcos adyacentes a i y no para todos los posibles
arcos que pudieran tener como origen i. El grafo, por tanto, se representa por
medio de un vector de n componentes (si |V|=n) donde cada componente va a ser
una lista de adyacencia correspondiente a cada uno de los vertices del grafo.
Cada elemento de la lista consta de un campo indicando el vrtice adyacente. En
caso de que el grafo sea etiquetado, habr que aadir un segundo campo para
mostrar el valor de la etiqueta.

Esta representacion requiere un espacio proporcional a la suma del nmero de


vrtices, ms el nmero de arcos, y se suele usar cuando el nmero de arcos es
mucho menor que el nmero de arcos de un grafo completo. Una desventaja es
que puede llevar un tiempo O(n) determinar si existe un arco del vrtice i al
vrtice j, ya que puede haber n vertices en la lista de adyacencia asociada al
vrtice i.
Mediante el uso del vector de listas de adyacencias slo se reserva memoria para
los arcos existentes en el grafo con el consiguiente ahorro de la misma. Sin
embargo, no permite que haya vrtices que puedan ser aadidos o suprimidos del
grafo, debido a que la dimension del grafo debe ser predeterminadoa y fija. Para
solucionar esto se puede usar una lista de listas de adyacencia. Slo los vrtices
del grafo que sean origen de algun arco aparecern en la lista. De esta forma se
pueden aadir y suprimir arcos sin desperdicio de memoria ya que simplemente
habr que modificar la lista de listas para reflejar los cambios.

Como puede verse en el ejemplo de las figuras anteriores tanto el vector de listas
de adyacencias como en la lista de listas se ha razonado en funcin de los vrtices
que actan como origenes de los arcos. Anlogamente se poda haber hecho con

lod vertices destino, y combinando ambas representaciones podra pensarse en


utilizar dos vectores de listas de adyacencia o dos listas de listas de adyacencia.
REPRESENTACION PROPUESTA.
La eleccin de una estructura idnea para representar el TDA grafo no es una
tarea fcil ya que existen dos representaciones totalmente contrapuestas: por un
lado tenemos la matriz de adyacencias que es muy eficiente para comprobar si
existe una arista uniendo dos vertices peero que sin embargo desperdicia una
gran cantidad de espacio si el grafo no es completo o esta lejos de serlo, adems
no tiene la posibilidad de aadir nuevos vrtices; y por otra parte est la lista de
adyacencias que no tiene el problema de la anterior respecto al espacio pero que
sin embargo no es tan eficiente a la hora de ver si existe una arista entre dos
nodos determinados.
Teniendo en cuenta estas consideraciones se ha optado por realizar una mezcla de
ambas representaciones intentando aprovechar de alguna forma las ventajas que
ambas poseen. Por otra parte siguiendo con la idea de tratar tanto los grafos
dirigidos como los no dirigidos bajo una misma estructura, la estructura elegida
posee dos apariencias ligeramente diferentes para tratar de forma adecuada cada
uno de estos dos tipos de grafos.
La estructura consiste (en el caso de que tengamos un grafo dirigido en una lista
de vrtices donde cada uno de estos posee dos listas, una de aristas incidentes a l
y otra de adyacentes. Cada vez que se aade una arista al grafo se inserta en la
lista de aristas adyacentes del vertice origen y en la de incidentes del vrtice
destino. De esta forma la estructura desplegada se asemejara a una matriz de
adyacencia en la cual hay una arista por cada 1 y el ndice de la matriz es la
posicin dentro de la lista de vertices.
Graficamente la estructura para un grafo dirigido queda como se puede apreciar
en la siguiente figura.El puntero que de la estructura arco que apunta al destino se
ha sustituido por la etiqueta del nodo destino en el grafico para simplificarlo y
hacerlo mas claro.

Esta estructura no seria la mas idonea si trabajamos con solo con grafos no
dirigidos ya que por cada arista no dirigida tendriamos que insertar en la
estructura una misma arista dirigida repetida dos veces (una con un vrtice como
origen y el otro como destino y al contrario). En muchos problemas si asumimos

el desperdicio de espacio podria , de todas formas, resultar interesante representar


un grafo no dirigido como un grafo dirigido simetrico, el problema se preesenta
cuando al tener dos aristas dirigidas esto supone la presencia de un ciclo en el
grafo que realmente no existe.
Teniendo en cuenta el razonamiento anterior, en el caso de que queramos manejar
grafos no dirigido la estructura consistiria en tener una lista de adyacencia para
cada uno de los vertices pero tratando aquellas aristas que aparecen en la lista de
adyacencia de dos vertices distintos y que unen ambos vrtices como una nica
arista lgica (a estas dos aristas que forman una misma arista lgica las
llamaremos aristas gemelas).
Estructuras Internas.
Esta representacion tiene tres estructuras diferenciadas:
Estructura correspondiente a un vrtice.
o nodo: Codigo interno que permite numerar los nodos de 1 a n.
o etiq: Puntero a caracter en el que se encuentra la informacin que
posee ese vrtice, es decir su etiqueta.
o ady: Es un puntero a una lista que contiene las aristas que tienen
como origen ese vrtice.
o inc: Es un puntero a una lista que contiene las aristas que tienen
como destino ese vrtice (solo para grafos dirigidos).
o sig: Es un puntero que apunta al vrtice que ocupa la posicion
siguiente dentro de la lista de vertices.

Estructura bsica del grafo.


En realidad se usa la misma estructura que para los nodos pero poniendo
los campos etiq, ady y sig a NULL. Los dos campos restantes contienen:
o nodo: Contien el nmero de nodos del grafo.

o sig: Es un puntero que apunta al vrtice que ocupa la primera


posicion dentro de la lista de vertices.

Estructura correspondiente a una arista (grafo dirigido).


o origen: Es un puntero al vrtice que es el origen de esa arista.
o destino: Es un puntero al vrtice que es el destino de esa arista.
(Nosotros hemos sustituido el puntero por la etiqueta del nodo
destino para mayor claridad del dibujo).
o valor: Este campo contiene el peso de la arista que sera un numero
entero.
o sig: Puntero que apunta a la siguente arista dentro de la lista de
aristas adyacentes o incidentes.

Estructuras Internas del TDA grafo.

/* Implementacion basada en una lista de nodos de los que cuelga */


/* la lista de arcos de salida.
*/
#include
#include
#include
#define TE 5
#define Nulo NULL
typedef char *tetq;
typedef float tvalor;
typedef struct
struct
struct
tvalor
struct
} *tarco;

arco {
nodo *origen;
nodo *destino;
valor;
arco *sig;

typedef struct nodo {

int nodo;
tetq etiq;
tarco ady;
tarco inc;
struct nodo *sig;
} *tnodo;
typedef tnodo tgrafo;

5. IMPLEMENTACIN DE EL TDA GRAFO.

LISTA DE PRIMITIVAS.
Lista de primitivas para los grafos dirigidos:
Crear: Funcin que se encarga de crear un grafo vacio.
Etiqueta: Funcion que devuelve la etiqueta asociada a un nodo en un
grafo.
Label: Funcion que devuelve la Label de un nodo en el grafo.
LocalizaLabel: Esta funcin recibe el entero l (el label asociado a un nodo
que se supone pertenece al grafo y nos devuelve el nodo asociado con esa
label.
ExisteArco: Funcin que devuelve 1 si existe un arco entre el nodo o y el
nodo d en el grafo g, si no existe dicho arco devuelve 0.
PrimerArco: Devuelve el primer arco que sale del nodo n en el grafo g, si
no existe dicho primer arco devuelve Nulo.
SiguienteArco: Funcin que devuelve el arco siguiente al arco a en el
nodo n si no existe dicho arco devuelve Nulo.

PrimerArcoInv: Devuelve el primer arco que entra en el nodo n en el


grafo g. Si no existe dicho arco devuelve Nulo.
SiguienteArcoInv: Devuelve el siguiente arco tras a que entra en el nodo
n, si no existe dicho arco devuelve Nulo.
PrimerNodo: Devuelve el primer nodo del grafo G, si no existe devuelve
nulo.
SiguienteNodo: Devuelve el nodo siguiente en orden al nodo n en el grafo
g. Si no existe devuelve nulo.
NodoOrigen: Devuelve el nodo origen del arco a.
NodoDestino: Devuelve el nodo destino del arco a.
presentarGrafo: Escribe el grafo g en pantalla.
NumeroNodos: Devuelve el numero de nodos de un grafo g.
grafoVacio: Devuelve Nulo si el grafo esta vacio.
EtiqArco: Funcion que devuelve la etiqueta asociada a un arco, es decir el
peso del arco.
InsertarNodo: Funcion que inserta un nodo nuevo en un grafo.
InsertarArco: Funcion que se encarga de insertar un arco entre el nodo
org y el dest en el grafo g, asociado al arco le podemos dar un valor.
BorrarArco: Funcion que borra el arco existente entre los nodos org y
dest.
DesconectarNodo: Funcin que devuelve el grafo que se obtiene al
eliminar un nodo de un grafo G.Todos los arcos que entran o salen del
nodo a eliminar tambien desaparecen.
Destruir: Funcion que destruye el grafo g liberando la memoria que
ocupa.
CopiarGrafo: Funcion que hace una copia del grafo g.

Vous aimerez peut-être aussi