Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Departamento de informtica
Campus de Segovia
Estructura de datos
Tema 7: Grafos
NDICE
Representacin y operaciones
Conceptos bsicos
Representaciones
Operaciones del TAD Grafo
Recorridos
CONCEPTOS BSICOS
CONCEPTOS BSICOS
CONCEPTOS BSICOS
G1 = {V1, A1}
G2 = {V2, A2}
G1 es no dirigido. V1 = {1, 4, 5, 7, 9}
A1 = {(1, 4), (5, 1), (7, 9), (7, 5), (4, 9), (4, 1),
(1, 5), (9, 7), (5, 7), (9, 4)}; (v1, v2) v1-v2
G2 es dirigido (digrafo). V2 = {C, D, E, F, H}
A2 = {(C, E), (E, D), (F, E), (F, H), (H, F),
(D, H)}; (v1, v2) v1 v2
CONCEPTOS BSICOS
ADYACENCIA:
CONCEPTOS BSICOS
GRADO DE UN VRTICE:
Nmero de arcos o aristas incidentes a dicho
vrtice.
CONCEPTOS BSICOS
Un bucle es un camino de
un vrtice a s mismo, (v, v).
CONCEPTOS BSICOS
Ejemplos:
a)
CONCEPTOS BSICOS
CONCEPTOS BSICOS
CONEXIN:
CONCEPTOS BSICOS
Ejemplo:
Analizar la conexin y completitud de
los siguientes grafos:
REPRESENTACIN DE GRAFOS
REPRESENTACIN DE GRAFOS
REPRESENTACIN DE GRAFOS
REPRESENTACIN DE GRAFOS
MATRIZ ADYACENCIA
Declaracin de tipos:
const
maxvert = 20;
type
indice = 1..maxvert;
a) Asociarse directamente a la matriz definiendo
vertice = string;
un tipo subrango que englobe todos los valores
= array [indice]
de losvertices
pesos. Cambiar
0..1 por of
esevertice;
tipo.
mtAdyace = array [indice, indice] of 0..1;
b) Definir un tipo arco como:
grafo = record
type
n: indice;
...
v: vertices;
A: mtAdyace
arco = record
end;
adye: boolean;
var G: grafo;
peso: real
end; tiene factor de peso numrico,
Si el grafo
cmo lo podemos declarar?
mtAdyace = array [indice, indice] of arco;
REPRESENTACIN DE GRAFOS
Desventajas de la matriz de adyacencia:
La matriz de adyacencia puede resultar poco
eficiente en los siguientes casos:
a) Cuando el nmero de vrtices vare a lo largo
del proceso, sucediendo que sea mayor del
previsto.
b) Cuando el grafo es disperso, tiene pocos arcos.
Esto hace que la matriz tenga muchos ceros y
ocupa el mismo espacio que si el grafo tuviera
muchos arcos.
Las listas de adyacencia son una estructura
multienlazada formada por una lista directorio
cuyos nodos representan los vrtices del grafo y
de cada nodo tambin emerge una lista enlazada
cuyos nodos representan los arcos con vrtice
origen el del nodo de la lista directorio.
REPRESENTACIN DE GRAFOS
LISTA ADYACENCIA
Declaracin de tipos:
Cada nodo de la lista directorio almacena el
vrtice al que representa, la direccin de acceso
a la lista de adyacencia y la direccin del nodo
siguiente de la lista directorio.
type
tDir = ^NodoDir;
tAdy = ^NodoLy;
NodoDir = record
vertice: string;
plista: tAdy;
sig: tDir
end;
LISTA ADYACENCIA
Declaracin de tipos:
Cada nodo de la lista de adyacencia de un
vrtice del grafo almacena la direccin del
vrtice (en la lista directorio) con el que forma
un arco, en caso de ser un grafo valorado
tambin el factor peso, y como en todas las
listas la direccin del nodo siguiente.
type
NodoLy = record
pvert: tDir;
peso: real;
sig: tAdy
end;
var G: tDir;
Funciones auxiliares:
function libera (L: tAdy); {Borra todos los
var aux: tAdy;
elementos de una lista
begin
enlazada adyacente}
while L <> nil do
begin
aux := L; L:= L^.sig;
dispose (aux)
end;
function Ultimo (L: tAdy): tAdy; {Devuelve el
begin
ptro. al ltimo nodo de una
if L <> nil then
lista enlazada adyacente}
while L^.sig <> nil do L := L^.sig
Ultimo := L
end;
function UltimoV (D: tDir): tDir; {Devuelve el
begin
ptro. al ltimo nodo de la
if D <> nil then
lista directorio}
while D^.sig <> nil do D := D^.sig
UltimoV := D
end;
REPRESENTACIN DE GRAFOS
Ejercicio:
a) Dado el grafo:
Suponiendo la ordenacin
REPRESENTACIN DE GRAFOS
Ejercicio:
b) Dado el grafo:
Suponiendo la ordenacin
estndar.
RECORRIDO DE GRAFOS
La operacin de recorrer una estructura consiste
en visitar (procesar) cada uno de los nodos a
partir de uno dado.
Hay dos formas de recorrido:
a) Anchura
b) Profundidad
Recorrido en anchura: (2 estructuras auxiliares)
a) Una cola donde almacenar los vrtices hasta
ser procesados.
b) Una lista de vrtices visitados. Los nodos de
esta lista tienen como campos:
- Un puntero al vrtice correspondiente de la
lista directorio.
- Un valor de tipo lgico para marcar si el
vrtice ha sido visitado.
- Un puntero al siguiente elemento se la lista
de visitados.
RECORRIDO DE GRAFOS
Recorrido en anchura:
Tenemos el grafo:
RECORRIDO DE GRAFOS
Tipos de datos auxiliares:
type
ptrnodoq = ^Nodoq;
Nodoq = record
Info: string;
Sig: ptrnodoq
end;
Cola = record
Frente, Final: ptrnodoq
end;
ptrlista = ^Nodol;
Nodol = record
V:
tDir;
Vsdo: boolean;
Sig : ptrlista
end;
COLA
LISTA VISITADA
RECORRIDO DE GRAFOS
procedimiento Anchura (Grafo,
Puntero al vrtice desde el que empieza recorrido)
1.- Procedimiento Lvisitada que crea una lista de punteros
con todos los campos visitados a false.
2.- Funcin Direccion que devuelve un puntero al nodo de la
lista visitada donde se encuentra el nodo que apunta al nodo
de la lista directorio pasado como argumento.
RECORRIDO DE GRAFOS
RECORRIDO DE GRAFOS
RECORRIDO DE GRAFOS
begin
Encolar (N, Q);
Av^.Vsdo := true
end;
L := L^.sig
end;
until EsVacia(Q)
end;
Si se quieren visitar todos los vrtices del grafo,
una vez terminado el recorrido a partir de uno
dado (W) hay que buscar si queda algn vrtice
sin visitar en cuyo caso se vuelve a recorrer a
partir de l, as sucesivamente hasta que todos los
vrtices estn procesados.
RECORRIDO DE GRAFOS
Recorrido en profundidad:
Empieza por un vrtice que se marca como
visitado. Despus se visita hacia delante hasta
que sea posible.
Las estructuras auxiliares son:
a) Una pila donde almacenar los vrtices
adyacentes no procesados a uno dado.
b) Una lista de vrtices visitados. Los nodos de
esta lista tienen como campos:
- Un puntero al vrtice correspondiente de la
lista directorio.
- Un valor de tipo lgico para marcar si el
vrtice ha sido visitado.
- Un puntero al siguiente elemento de la lista
de visitados.
RECORRIDO DE GRAFOS
Recorrido en profundidad:
Tenemos el grafo:
RECORRIDO DE GRAFOS
Tipos de datos auxiliares:
type
ptrnodop = ^Nodop;
Nodop = record
Info: string;
Sig: ptrnodop
end;
ptrlista = ^Nodol;
Nodol = record
V:
tDir;
Vsdo: boolean;
Sig : ptrlista
end;
PILA
LISTA VISITADA
RECORRIDO DE GRAFOS
procedimiento Profundidad (Grafo,
Puntero al vrtice desde el que empieza recorrido)
1.- Procedimiento Lvisitada que crea una lista de punteros
con todos los campos visitados a false.
2.- Funcin Direccion que devuelve un puntero al nodo de la
lista visitada donde se encuentra el nodo que apunta al nodo
de la lista directorio pasado como argumento.
RECORRIDO DE GRAFOS
RECORRIDO DE GRAFOS
procedimiento Profundidad (Grafo,
Puntero al vrtice desde el que empieza
recorrido)
pasos del programa principal:
a) Se pone a true el campo visitado del
vrtice pasado como argumento.
b) Se obtiene la lista de adyacencia del
vrtice pasado como argumento.
c) Bucle hasta que la lista de adyacencia se
vace:
- Caso Base: Que el elemento de la lista de
visitados tenga el campo visitado a true
- Caso recursivo: Que no se haya visitado el
elemento.
RECORRIDO DE GRAFOS
Realizacin recursiva:
procedure Profundidad (W: tDir; var Lv: ptrlista);
var L: tAdy;
begin
Direccion (Lv, W)^.Vsdo := true;
L := W^.plista;{Lista enlazada ady. del nodo W}
while L<>nil do
begin
if not Direccion (Lv, L^.pvert)^.Vsdo then
Profundidad (L^.pvert, Lv);
L := L^.sig
end
end;
RECORRIDO DE GRAFOS
Ejercicio:
Calcular los recorridos en anchura y
profundidad del siguiente grafo desde el
vrtice A:
{A, B, D, C, E}
Profundidad: {A, D, E, C, B}
COMPONENTES CONEXAS
Para comprobar si un grafo no dirigido es
conexo, se puede realizar un recorrido en anchura
o profundidad, que parta de un vrtice cualquiera
de l. Al final el grafo ser conexo si el conjunto
de vrtices visitados en el recorrido coincide con
todos los vrtices del grafo.
En el caso de grafos dirigidos, se define un grafo
G que contiene los mismos vrtices que G pero
todos sus arcos han pasado a ser aristas. Si (v1,
v2) est en G, entonces en G estarn (v1, v2) y
(v2, v1). G es conexo si lo es G (no dirigido).
Si un grafo no es conexo se pueden determinar
las componentes conexas que son subgrafos
disjuntos del grafo original que son cada uno de
ellos conexos.
COMPONENTES CONEXAS
Algoritmo para determinar las componentes
conexas de un grafo G no dirigido:
1. Recorrer el grafo desde cualquier vrtice w.
Los vrtices visitados se guardan en un conjunto
W.
2. Si W es el conjunto de todos los vrtices del
grafo, entonces el grafo es conexo.
3. Si el grafo no es conexo, W es una componente
conexa.
4. Se toma un vrtice no visitado, z, y se realiza
de nuevo el recorrido del grafo a partir de z. Los
vrtices visitados W forman otra componente
conexa.
5. El algoritmo termina cuando todos los vrtices
han sido visitados.
COMPONENTES CONEXAS
COMPONENTES CONEXAS
COMPONENTES CONEXAS
begin {Componentes_Conexas}
{En T guardamos el conjunto de todos los vrtices}
with T do
begin
I := 0; Z:=G;
while Z<>nil do
begin
I:= I +1; Vc [I] := Z^.vertices;
Z:= Z^.sig
end;
LVisitada (Lv, G); {Todos los vrtices a false en campo
Z:= DirNovis (Lv);
visitado}
while Z<>nil do
begin
W.I:= 0;
Conexa (G, Z, Lv, W);
if W.I = T.I then writeln (Grafo conexo); {Grafo conexo}
for J:= 1 to W.I do write (W.Vc [J], ); {Componente
writeln
conexa}
end;
Z := DirNovis (Lv)
end
end;
COMPONENTES FUERTEMENTE
CONEXAS
Un grafo dirigido fuertemente conexo es aquel en
el que existe un camino entre cualquier pareja de
vrtices del grafo.
De no ser fuertemente conexo se pueden
determinar las componentes fuertemente conexas
del grafo.
COMPONENTES FUERTEMENTE
CONEXAS
Ejercicio:
Calcular las componentes fuertemente
conexas del siguiente grafo:
Solucin: {F}
{S, C, B}
{M}
MATRIZ DE CAMINOS
Sea G un grafo de n vrtices y A su matriz de
adyacencia de tipo lgico. A[i, k] and A[k, j] es
cierta si hay un arco del vrtice i al k y otro del
k al j. Tambin indica que hay un camino de
longitud 2 del vrtice i al j.
La expresin:
(A[i,1] and A[1, j]) or (A[i, 2] and A[2, j]) or ...
or (A[i, NumVerts] and A[NumVerts, j])
ser cierta si hay al menos 1 camino de longitud
2 desde el vrtice i al j que pase a travs del
vrtice 1, o del 2, o del NumVerts.
MATRIZ DE CAMINOS
Sea G un grafo de n vrtices y A su matriz de
adyacencia de tipo lgico:
MATRIZ DE CAMINOS
Sea G un grafo de n vrtices y A su matriz de
adyacencia de tipo lgico:
MATRIZ DE CAMINOS
Si en lugar de la matriz con valores lgicos, se
obtiene la matriz con 0 y 1, el valor de calcular
las potencias de la matriz de adyacencia
representa el nmero de caminos de longitud k
desde el vrtice i al j.
NMERO DE CAMINOS
MATRIZ DE CAMINOS
Sea G un grafo de n vrtices. La matriz de
caminos de G es una matriz nxn definida: pij
vale 1 si hay un camino de vi a vj y cero en caso
contrario.
El camino de vi a vj ser:
a) Simple si vi<>vj con longitud n-1 o menor.
b) Ciclo si vi = vj con longitud n o menor.
MATRIZ DE CAMINOS
Cierre transitivo:
De un grafo G es otro G que tiene los mismos
vrtices y que tiene como matriz de adyacencia
la matriz de caminos P del grafo G.
Segn esta definicin un grafo es fuertemente
conexo su cierre transitivo es un grafo
completo.
Ejercicio:
a) Cul es la matriz de caminos del siguiente
grafo?
b) es fuertemente conexo?
PUNTOS DE ARTICULACIN
Un punto de articulacin de un grafo no
dirigido es un vrtice V que si se elimina
junto a sus arcos, hace que la
componente conexa en que est el vrtice
se divide en dos o ms componentes.
PUNTOS DE ARTICULACIN