Vous êtes sur la page 1sur 27

Grafos

Fundamentos
Representaciones,
Jose Aguilar
Las estructura de datos no lineales se caracterizan por
existir una relacin de adyacencia genrica entre sus
elementos, es decir, un elemento puede estar
relacionado con cero, uno o ms elementos.
Introduccin
Hay mltiples aplicaciones de estas estructuras
Los grafos son estructuras que se utilizan para
modelar diversas situaciones tales como: sistemas
de comunicacin, redes de transporte, etc.
Los grafos tambin son muy utilizados en
computacin: modelar programas paralelos,
planificaciones de tareas del computador,
planificacin de E/S, etc..
La estructura no lineal de datos ms general es el
grafo,
Un grafo G (N, A, f) es un conjunto no vaco de:
Introduccin
N={n
1
, n
2,
, ... , n
M
) nodos o vrtices,
A={a
1,
a
2
, ..., a
K
} aristas y
la funcin f : R que indica los pares
de nodos que estn relacionados.
Hay dos tipos de grafos segn que sus relaciones
tengan direccin o no,
grafos dirigidos o digrafos
Introduccin
Digrafo, donde D = {N, A, f} tiene
N = {1, 2, 3},
1
2 a
b
grafos no dirigidos
N = {1, 2, 3},
A = {a, b, c, d} y
f(a) = (1, 2), f(b) = (2, 3),
f(c) = (1, 3),
3 c
1
2
3
f : A N x N pares ordenados de
nodos que indican de que nodo sale el
arco y a que nodo llega ese arco.
f : L N x N de pares no
ordenados que indican que esos
nodos estn unidos en ambas
direcciones
Se dice que el a
l
A asociado al par de nodos (n
i
, n
j
)
donde n
i
, n
j
N, comienza en n
i
y termina en n
j
. As, n
i
es el nodo inicial y n
j
es el nodo terminal.
Arco incidente: aj es un arco incidente sobre n
k
, si
Conceptos
Arco incidente: aj es un arco incidente sobre n
k
, si
n
k
es el nodo terminal de a
j
.
.
Arcos adyacentes: a
i
y a
j
son arcos adyacentes si
a
i
y a
j
son incidentes en el mismo nodo.
Arcos paralelos: Dos arcos son paralelos si ellos
comienzan y terminan en los mismos nodos.
Bucle o lazo: Si un arco a
l
comienza en n
i
y termina
en n
i
, entonces n
il
es un bucle.
Ejemplo: Si f(w) = (3, 3) entonces w es un lazo.
Conceptos
Nodos adyacentes: Dados un par de nodos (n
i
, n
j
)
que estn unidos por el arco a
l
, se dice que n
i
es
adyacente a n
j
por a
l
.
Ejemplo: 1 es adyacente a 2 por a.
Grado de incidencia positivo: El grado de incidencia
positivo de un nodo n
i
es el nmero de arcos que
tienen como nodo inicial a n
i
.
Grado de incidencia negativo: El grado de incidencia
Conceptos
Grado de incidencia negativo: El grado de incidencia
negativo de un nodo n
i
es el nmero de arcos que
terminan en n
i
.
.
Grado de un nodo: Para digrafos es el grado de
incidencia positivo menos el grado de incidencia
negativo del nodo.
.
Multiplicidad de un par ordenado (n
i
, n
j
): Dado el
digrafo D. Si para un par ordenado de nodos (n
i
, n
j
) N
x N, hay k arcos distintos en A para los que f(a
l
) = (n
i
,
n
j
), es decir, hay k arcos que unen n
i
con n
j
, se dice
que el par (n n ) tiene multiplicidad k donde k 0. La
Conceptos
j i j
que el par (n
i,
n
j
) tiene multiplicidad k donde k 0. La
funcin de multiplicidad m(n
i
, n
j
) = k.
Ejemplo: m(1, 1) = 0, m(1, 2) = 1, m(1, 3) = 1, etc.
Grafo simple: Un digrafo D es simple si cada par
ordenado (n
i
n
j
) N x N tiene como mximo de
multiplicidad el valor 1.
Matriz de conexin: Todo grafo G tiene asociado una
matriz M de dos dimensiones de orden |N| x |N|, cuyos
elementos representan la multiplicidad del par (n
i
, n
j
).
Conceptos
Ejemplo: La matriz de conexin del digrafo D es
0 1 1
M = 0 0 1
0 0 0
Camino: Un camino C del digrafo D es una secuencia
de arcos (a
1
, a
2
, ..., a
n
) tal que para todo par (a
i
, a
j
) de
arcos consecutivos en C, el fin de a
i
coincide con el
inicio de a
j
.
Conceptos
inicio de a
j
.
Camino simple: Es el camino que no recorre el mismo
arco dos veces.
Camino elemental: Es el camino que no visita un
mismo nodo ms de una vez.
Circuito: Es un camino finito en el que el origen del
primer arco coincide con el fin del ltimo.
Circuito simple: Un circuito es simple si a su vez es un
Conceptos
Circuito simple: Un circuito es simple si a su vez es un
camino simple.
Orden de un camino: Es el nmero de arcos que
conforman el camino.
Nodo accesible: Un nodo n
i
es accesible desde otro
nodo n
j
, si
1) n
i
= n
j
o
2) existe un camino desde n
i
hasta n
j
.
Conceptos
Nodo sucesor: Un nodo n
j
es sucesor de un nodo n
i
si
existe un camino que va desde n
i
hasta n
j
.
Nodo predecesor: Un nodo n
i
es predecesor de otro
nodo n
j
si existe un camino que va desde n
i
hasta n
j
.
Grafo conexo: Un grafo G es conexo si y slo si sus nodos
n
i
no pueden ser particionados en dos conjuntos no vacos
N1 y N2 en los que sus caminos desde un punto cualquiera
a otro estn en el mismo conjunto.
Conceptos
Un grafo es conexo si, para cualquier par de nodos a y b
en G, existe al menos una trayectoria (una sucesin de
vrtices adyacentes que no repita vrtices) de a a b
Subgrafo: Un subgrafo SG de G es un grafo constituido
por un subconjunto SN de N y un subconjunto SA de A que
conectan los nodos de SN.
Conceptos
conectan los nodos de SN.
Isomorfismo: Dos grafos G y G son isomrficos si existe
una biyeccin f: NN tal que (n
i
, n
j
) A (f(n
i
), f(n
j
)) A.
Vecino: En un grafo dirigido G, el vecino de un nodo n es
cualquier nodo adyacente a n en la versin no dirigida de
G.
Cadena: Para un grafo no dirigido GND es la secuencia
de lneas (I
1
, I
2
, ..., I
n
) tal que el fin I
i
coincide con el
origen de I
i+1
.
Conceptos
i+1
Cadena simple: Es la cadena donde ninguna lnea se
repite.
Cadena elemental: Es la cadena donde ningn nodo
se repite.
Ciclo: Es una cadena finita donde el nodo inicial de
la cadena coincide con el nodo terminal de la misma.
Conceptos
Ciclo simple: Es el ciclo que a su vez es una cadena
simple.
Ciclo hamiltoniano.
Grafo mltiple: Es un grafo que contiene alguna
arista paralela.
Digrafo acclico: Es un digrafo que no contiene
circuitos. Se le conoce con las siglas dag.
Conceptos
circuitos. Se le conoce con las siglas dag.
Grafo o digrafo con peso: Es un grafo o digrafo
que tiene un valor entero o real asignado a cada
arista.
Grafo completo: Es un grafo no dirigido donde
cada par de nodos es adyacente
Grafo bipartito: Es un grafo no dirigido que puede ser
dividido en dos subgrafos sin conexin entre ellos.
Multigrafo: Es un grafo no dirigido que puede tener
Conceptos
Multigrafo: Es un grafo no dirigido que puede tener
varias aristas y lazos entre sus nodos.
Hipergrafo: Es un grafo no dirigido con hiper-aristas
que conectan varios nodos.
Ejemplo: hipertexto e hipermedia.
Un grafo se especifica en base a sus funciones
bsicas, entre las que se pueden mencionar:
TDA
bsicas, entre las que se pueden mencionar:
crearlo,
insertar un nodo nuevo o una arista nueva,
conocer si est vaco o no,
consultar si un nodo existe, etc.
Existen dos mtodos para almacenar un grafo G:
Matriz de adyacencia: se implementa utilizando
TDA
Matriz de adyacencia: se implementa utilizando
el mtodo secuencial o con arreglos y
Listas de adyacencia implementada utilizando el
mtodo enlazado o listas enlazadas
Es un arreglo de dos dimensiones que representa las
conexiones entre pares de nodos o vrtices.
Sea un grafo G con un conjunto de nodos N y un
conjunto de aristas A. Suponga que el grafo es de
orden n (nmero de nodos del grafo), donde
Matriz de adyacencia
orden n (nmero de nodos del grafo), donde
n > 0.
La matriz de adyacencia se representa por un
arreglo de tamao n x n, donde: M(i, j) = 1 si existe
un arco(n
i
n
j
) en A, 0 en caso contrario
Las columnas y las filas de la matriz representan los
nodos del grafo.
Si el grafo es no dirigido, la matriz es simtrica M(i,j)
= M(j,i).
Matriz de adyacencia
El segundo mtodo utilizado para representar grafos es
til cuando un grafo posee muchos nodos y pocas
aristas (grafos no densos).
Se utiliza una lista enlazada, llamada directorio, que
almacena los nodos N del grafo y asociado a cada
nodo del grafo se encuentra una lista enlazada con
los nodos que son adyacentes a l.
Listas de adyacencia
los nodos que son adyacentes a l.
En las listas estn las aristas del grafo.
Un grafo no dirigido de orden N con A aristas
requiere N entradas en el directorio y 2*A entradas
de listas enlazadas, excepto si existen bucles, que
reduce el nmero de entradas a la lista en 1
Un grafo dirigido de orden N con A arcos requiere
N entradas en el directorio y A entradas de listas
enlazadas
Listas de adyacencia
1
5
2
4
3
1
2
3
4
5
2
5
1 5 4
2
5
2
4
3
2
4
3
1
1
4
2
5
3
1
2
3
4
5
6
2
4
5
5
2
6
6
4
6
tipo de datos abstractos (TDAs)
20/11/07 Especificacin Grafo[TipoEle]
1
Sintctica
creaGrafo()Grafo,
nuevoNodo(Grafo,TipoEle) Grafo,
nuevaArista(Grafo,TipoEle,TipoEle) Grafo,
eliNodo(Grafo,TipoEle) Grafo,
eliArista(Grafo,TipoEle,TipoEle) Grafo,
conNodo(Grafo,TipoEle) Lgico,
conArista(Grafo,TipoEle,TipoEle) Lgico,
-creaGrafo() !rea un grafo vac"o#
-nuevoNodo() $ngresa un nuevo nodo al grafo
-nuevaArista() $ngresa una nueva arista entre
los dos nodos especificados, si e%isten#
-eliNodo() Eli&ina un nodo del grafo#
conArista(Grafo,TipoEle,TipoEle) Lgico,
nodoAd'acente(Grafo,TipoEle) Lista[TipoEle],
vac"oGrafo(Grafo) Lgico>
-eliNodo() Eli&ina un nodo del grafo#
-eliArista() Eli&ina una arista del grafo entre
los nodos especificados#
-conNodo() (egresa verdadero s" e%iste en el
grafo#
-conArista() (egresa verdadero si el arco
e%iste#
-nodoAd'acente() (egresa la lista de los arcos
ad'acentes a )l#
-vac"oGrafo() (egresa verdadero si es el grafo
esta vac"o
-destru'eGrafo() *estru'e el grafo
2
Declaraciones
TipoEle no,+TipoNo*ef,
3
Semntica
vac"oGrafo(creaGrafo())-.erdadero
vac"oGrafo(nuevoNodo(creaGrafo(),no)-/also
conNodo(creaGrafo(), no)-/also
conNodo(nuevoNodo(creaGrafo(),no),no)-.erdadero
conArista(creaGrafo(),no,no)-/also
conArista(nuevaArista(creaGrafo(),no,no),no,no)-!ierto
eliNodo(creaGrafo(),no)-creaGrafo()
Definicin del universo de clases y tipo de datos
abstractos (TDAs)
Versin 1.0
Grafo[TipoEle]
!lases Arreglo de Entero, Entero, Ta0la, TipoEleTa0, 1alida[TipoEle], TipoEle}
1
2
3
4
5
Estructura privado
2peraciones p30lico
Grafo()
nuevoNodo(TipoEle n)
nuevaArista(TipoEle ni, TipoEle nf)
-Grafo()# Constructor. Crea un grafo vaco
-nuevoNodo()# Transformador. Inserta un nuevo nodo al
grafo.
-nuevaArista()# Transformador. Ingresa un nuevo arco al
grafo. 5
6
nuevaArista(TipoEle ni, TipoEle nf)
eliNodo(TipoEle n)
eliArista(TipoEle ni, TipoEle n4)
conNodo(TipoEle n) Lgico
conArista(TipoEle ni, TipoEle nf)Lgico
nodoAd'acente(TipoEle n, Entero t) Arreglo[566] de
TipoEle
recorridoEnA&p()
recorridoEn7rof()
ruta2pti&a(TipoEle n4) Arreglo[566] de
1alida[TipoEle]
vac"oGrafo()Lgico
nu&Nodos()Entero
nu&Aristas()Entero
-(Grafo[TipoEle])
Grafo()
grafo.
-eliNodo()# Transformador. Elimina un nodo del grafo
-eliArista()# Transformador. Elimina un arco del grafo.
-conNodo()# Observador. Regresa verdadero, si existe.
-conArista()# Observador. Regresa verdadero si existe el
arco.
-nodoAd'acente()# Observador. Regresa el arreglo de
nodos ad'acentes ' su ta&a8o#
-recorridoEnA&p()# Observador. Recorre el grafo en
amplitud.
-recorridoEn7rof()# Observador. Recorre el grafo en
profundidad
-ruta2pti&a()# Observador. Regresa un arreglo con los
nodos 9ue confor&an el ca&ino de &enos arcos a partir
de un nodo inicial
-vacioGrafo()# Observador. Regresa verdadero si el grafo
est vac"o#
Listas de adyacencia
#include <vector>
#include <list>
vector< list<int> > grafo(MAX_VERT);
char visitado[MAX_VERT];
void inserta_arista(int i, int j){
grafo[i].push_back(j);
grafo[j].push_back(i);
}
void limpia_grafo(){
int i;
for(i = 0; i < nvert; i++){ for(i = 0; i < nvert; i++){
grafo[i].clear();
visitado[i] = 0;
}
}
list<int>::iterator aux, fin;
aux = grafo[j].begin();
fin = grafo[j].end();
while(aux != fin){
if(!visitado[*aux]){
pila.push(*aux);
visitado[*aux] = 1;
}
aux++;

Vous aimerez peut-être aussi