Está en la página 1de 26

ED 2008/09 1

4.3 Exploracin de grafos


G4.3.1 Recorrido en Profundidad
G4.3.2 Recorrido en Anchura
G4.3.3 Vuelta Atrs
4.3.3.1 Esquema de la Tcnica

4.3.3.2 Ejemplos
G4.3.4 Ramificacin y Poda
4.3.4.1 Esquema de la Tcnica
4.3.4.2 Ejemplos
ED 2008/09 2
4.3.1 Recorrido en
Profundidad
Un grafo, G, es un TAD compuesto por
dos conjuntos:
Grafos no dirigidos: V es el conjunto de
vrtices y A el de aristas. Cada arista est
formada por un par de vrtices (v
i
, v
j
)
Grafos dirigidos: N es el conjunto de
nodos y A el de arcos. Cada arco est
formado por un nodo origen y un nodo
destino <n
o
, n
d
>


ED 2008/09 3
4.3.1 Recorrido en
Profundidad
Tenemos un grafo, G = <V, A> y
suponemos que podemos marcar un
vrtice como visitado.
Recorrido en profundidad - Lanza
tantas llamadas recursivas como sea
posible antes de volver de una llamada.
ED 2008/09 4
4.3.1 Recorrido en
Profundidad
Pasos del Algoritmo:
Pto. de partida v - V, lo marcamos como visitado.
Si w - V no visitado y adyacente a v, lo tomamos
como pto. de partida y lanzamos recursivamente el
algoritmo.
Si al regresar de la recursin x - V no visitado y
adyacente a v, hacemos lo mismo que en el pto. 2.
Si y - V que no ha sido visitado, hacemos lo mismo
que en el pto. 2.
Terminamos cuando ' v - V se han visitado.


ED 2008/09 5
4.3.1 Recorrido en
Profundidad
2
4
3
5
1
7
8
9
6
ED 2008/09 6
4.3.1 Recorrido en
Profundidad
2
4
3
5
1
7
8
9
6
Adyacentes a 1: 2, 4, 8
Recorrido: 1, 2


ED 2008/09 7
4.3.1 Recorrido en
Profundidad
2
4
3
5
1
7
8
9
6
Adyacentes a 2: 1, 3, 4
Recorrido: 1, 2, 3
ED 2008/09 8
4.3.1 Recorrido en
Profundidad
2
4
3
5
1
7
8
9
6
Adyacentes a 3: 2, 4, 5
Recorrido: 1, 2, 3, 4


ED 2008/09 9
4.3.1 Recorrido en
Profundidad
2
4
3
5
1
7
8
9
6
Adyacentes a 4: 1, 2, 3, 7
Recorrido: 1, 2, 3, 4 , 7
ED 2008/09 10
4.3.1 Recorrido en
Profundidad
2
4
3
5
1
7
8
9
6
Adyacentes a 7: 4, 6, 9
Recorrido: 1, 2, 3, 4, 7, 6


ED 2008/09 11
4.3.1 Recorrido en
Profundidad
2
4
3
5
1
7
8
9
6
Adyacentes a 6: 5, 7
Recorrido: 1, 2, 3, 4, 7, 6, 5
ED 2008/09 12
4.3.1 Recorrido en
Profundidad
2
4
3
5
1
7
8
9
6
Adyacentes a 5: 3, 6
Recorrido: 1, 2, 3, 4, 7, 6, 5


ED 2008/09 13
4.3.1 Recorrido en
Profundidad
2
4
3
5
1
7
8
9
6
Adyacentes a 6: 5, 7
Recorrdo: 1, 2, 3, 4, 7, 6, 5
ED 2008/09 14
4.3.1 Recorrido en
Profundidad
2
4
3
5
1
7
8
9
6
Adyacentes a 7: 4, 6, 9
Recorrido: 1, 2, 3, 4, 7, 6, 5, 9


ED 2008/09 15
4.3.1 Recorrido en
Profundidad
2
4
3
5
1
7
8
9
6
Adyacentes a 9: 7, 8
Recorrido: 1, 2, 3, 4, 7, 6, 5, 9 , 8
ED 2008/09 16
4.3.1 Recorrido en
Profundidad
procedimiento recorrido_en_profundidad (G: grafo)
para cada v - N hacer
marca[v] - no visitado
fpara
para cada v - N hacer
si marca[v] = visitado entonces
rp(G, marca, v)
fsi
fpara
fprocedimiento
procedimiento rp (G: grafo; marca:vector[1..n]; v: nodo)
{El nodo v no ha sido visitado anteriormente}
marca[v] - visitado
para cada nodo adyacente a v hacer
si marca[w] = visitado entonces
rp(G, marca, w)
fsi
fpara
fprocedimiento


ED 2008/09 17
4.3.1 Recorrido en
Profundidad
PROCEDURE RecorreProfundidad (g: TGrafo);
VAR
n: integer;
nodo: TNodo;
marca: TVisitado;
c: TipoConjuntoNodos;
BEGIN
DameNodos(g, c);{TAD grafo}
n:= Cardinal(c); {TAD Conjunto}
InicializarVisitados(marca, n); {TAD TVisitado}
WHILE NOT EsConjuntoVacio(c) DO BEGIN
DameNodo(c, nodo); {TAD Conjunto}
Quitar(c, nodo);{TAD Conjunto}
IF NOT EsVisitado(marca,nodo) THEN {TAD TVisitado}
rp(g, nodo, marca);
END;
ED 2008/09 18
4.3.1 Recorrido en
Profundidad
PROCEDURE rp(g:TGrafo; nodos:TNodo; VAR marca:TVisitado);
{El nodo n no ha sido visitado anteriormente}
VAR i, k: integer;
adya: TipoConjuntoNodos;
BEGIN
MarcarVisitado(marca,n); {TAD TVisitado}
Adyacentes(g,adya,n);{TAD grafo, devuelve los adyacentes a n}
WHILE NOT EsConjuntoVacio(adya) DO BEGIN
DameNodo(adya, nodo); {TAD Conjunto}
Quitar(adya, nodo); {TAD Conjunto}
IF PerteneceConjuntoNodos(adya,nodo) AND
NOT EsVisitado(marca,i) THEN
rp(g, marca, nodo);
END;
END;


ED 2008/09 19
4.3.1 Recorrido en
Profundidad
Complejidad:
Cada nodo se visita 1 vez = n llamadas a rp = (n)
Examinamos todas las aristas = (a)

Por tanto podemos concluir que (max(n,a))


ED 2008/09 20
4.3.1 Recorrido en
Profundidad
GEl recorrido en profundidad de un grafo conexo, G,
crea un rbol de recubrimiento T:
Las aristas de T - aristas de G empleadas en el recorrido en
profundidad.
La raz de T - punto de partida de la exploracin de G
GSi el grafo no es conexo, tendremos un rbol de
recubrimiento por cada componente conexa.
GLa exploracin en profundidad de un grafo nos
permite 'numerar' los nodos del grafo en 'preorden'.


ED 2008/09 21
4.3.1 Recorrido en
Profundidad
1
2 3 4
5 6 7 8
EjempIo: recorrido en profundidad del
siguient e grafo no dirigido
ED 2008/09 22
4.3.1 Recorrido en
Profundidad
1
2 3 4
5 6 7 8
Secuencia de IIamadas a rp:
1. rp(1) {llamada inicial}
2. rp(2) {llam. rec.}
3. rp(3) {llam. rec.}
4. rp(6) {llam. rec}
5. rp(5) {llam. rec. no se puede continuar}
6. rp(4) {llam. adyacente al nodo 1}
7. rp(7) {llam. rec}
8. rp(8) {llam. rec. no se puede continuar}


ED 2008/09 23
4.3.1 Recorrido en
Profundidad
rboI de recorrido en profundidad (T):
1
2 3 4
5 6 7 8
ED 2008/09 24
4.3.1 Recorrido en
Profundidad
GPuntos de articuIacin: un vrtice v de un grafo
conexo es un punto de articulacin si el subgrafo
que se obtiene de eliminar v y todas las aristas
incidentes en v ya no es conexo.
GGrafo biconexo (o no articuIado): aquel grafo
conexo que no tiene puntos de articulacin.
GGrafo bicoherente (o 2-arista conexo): aquel
grafo cuyos puntos de articulacin estn unidos a
cada componente del subgrafo restante por, al
menos, dos aristas.


ED 2008/09 25
4.3.1 Recorrido en
Profundidad
GSi el grafo representa un sistema de
comunicaciones:

Que dicho grafo sea biconexo nos asegura el


correcto funcionamiento de la red aunque falle el
equipo de uno de los nodos.

Que dicho grafo sea bicoherente nos asegura el


correcto funcionamiento de la red aunque falle
una lnea de transmisin.
ED 2008/09 26
4.3.1 Recorrido en
Profundidad
GCIcuIo de puntos de articuIacin:
GpreNum[v]: es el nmero asignado a cada vrtice v
en el recorrido en profundidad del grafo (recorrido
en preorden del rbol).
GmasAlto[v]: sea w el nodo ms alto del rbol que se
puede alcanzar desde v siguiendo cualquier nmero
de lineas contnuas y subiendo por una lnea
discontnua como mximo. Entonces, se define
masAlto[v] como preNum[w].


ED 2008/09 27
4.3.1 Recorrido en
Profundidad
CIcuIo de puntos de articuIacin:
1
2 3 4
5 6 7 8
A la izquierda de cada vrtice v
se representa preNum[v]
A la derecha de cada vrtice v
se representa masAlto[v]
ED 2008/09 28
4.3.1 Recorrido en
Profundidad
GCIcuIo de puntos de articuIacin:
GSea v cualquier nodo del rbol excepto la raz y x un
hijo de v:
Si masAlto[x]<preNum[v] se puede llegar desde x a
regiones ms altas del grafo sin pasar por la arista (v,x),
luego v no es punto de articulacin.
Si masAlto[x]preNum[v] no se puede llegar desde x a
regiones ms altas del grafo sin pasar por la arista (v,x),
luego v es punto de articulacin.
GSi v es la raz del rbol y tiene ms de un hijo, es
punto de articulacin.


ED 2008/09 29
4.3.1 Recorrido en
Profundidad
Procedimiento para eI cIcuIo de puntos de
articuIacin:
Efectuar un recorrido en profundidad de G, generando un
arbol T y calculando preNum[v].
Recorrer T en postorden. Calcular masAlto[v] como el mnimo
de:
preNum[v]
preNum[w] para todo w tal que haya una arista (v,w) en G que
no est en T.
masAlto[x] para todo hijo x de v.
Calcular los puntos de articulacin de G:
la raz es punto de articulacin si y solo si tiene ms de un hijo
Cualquier otro nodo v es punto de articulacin si y solo si tiene
un hijo x tal que masAlto[x] preNum[v].
ED 2008/09 30
4.3.1 Recorrido en
Profundidad
GSi G={N,A} es dirigido:

El algoritmo de recorrido en profundidad es


esencialmente el mismo

Con la salvedad de que hay que redefinir la


interpretacin de la palabra "adyacente"
GEn un grafo dirigido, el nodo w es adyacente a otro
nodo v si existe la arista dirigida <v,w>.
GSi existe <v,w> pero no existe <w,v>, w es
adyacente a v pero v no es adyacente a w.


ED 2008/09 31
4.3.1 Recorrido en
Profundidad
EjempIo: recorrido en profundidad del
siguient e grafo dirigido
ED 2008/09 32
4.3.1 Recorrido en
Profundidad
Secuencia de IIamadas a rp:
1. rp(1) {llamada inicial}
2. rp(2) {llam. rec.}
3. rp(3) {llam. rec. no se puede continuar}
4. rp(4) {llam. adyacente al nodo 1}
5. rp(8) {llam. rec.}
6. rp(7) {llam. rec. no se puede continuar}
7. rp(5) {nuevo punto de comienzo}
8. rp(6) {llam. rec. no se puede continuar}


ED 2008/09 33
4.3.1 Recorrido en
Profundidad
Bosque de recorrido en profundidad:
ED 2008/09 34
4.3.2 Recorrido en Anchura
Un grafo, G, es un TAD compuesto por dos
conjuntos:
Grafos no dirigidos: V es el conjunto de
vrtices y A el de aristas. Cada arista est
formada por un par de vrtices, (v
i
, v
j
)
Grafos dirigidos: N es el conjunto de
nodos y A el de arcos. Cada arco est
formado por un nodo origen y un nodo
destino <n
o
, n
d
>


ED 2008/09 35
4.3.2 Recorrido en Anchura
Tenemos un grafo, G = <V, A> y
suponemos que podemos marcar un nodo
como visitado.
Recorrido en anchura - visita todos los
vecinos de un nodo antes de avanzar.
El recorrido en anchura no es recursivo.
ED 2008/09 36
4.3.2 Recorrido en Anchura
Pasos del Algoritmo:
Pto. de partida v - V, lo marcamos como
visitado.
'
' w - V no visitado y adyacente a v, lo
visitamos.
Visitamos todos los nodos adyacentes a los
nodos w visitados en el paso anterior que an
no hayan sido visitados.
Terminamos cuando ' v - V se han visitado.


ED 2008/09 37
4.3.2 Recorrido en Anchura
2
4
3
5
1
7
8
9
6
Adyacentes a 1: 2, 4, 8
Recorrido: 1, 2, 4, 8
ED 2008/09 38
4.3.2 Recorrido en Anchura
2
4
3
5
1
7
8
9
6
Adyacentes a 2: 1, 3, 4
Recorrido: 1, 2, 4, 8 , 3


ED 2008/09 39
4.3.2 Recorrido en Anchura
2
4
3
5
1
7
8
9
6
Adyacentes a 4: 1, 2, 3, 7
Recorrido: 1, 2, 4, 8, 3, 7
ED 2008/09 40
4.3.2 Recorrido en Anchura
2
4
3
5
1
7
8
9
6
Adyacentes a 8: 1, 9
Recorrido: 1, 2, 4, 8, 3, 7, 9


ED 2008/09 41
4.3.2 Recorrido en Anchura
2
4
3
5
1
7
8
9
6
Adyacentes a 3: 2, 4, 5
Recorrido: 1, 2, 4, 8, 3, 7, 9, 5
ED 2008/09 42
4.3.2 Recorrido en Anchura
2
4
3
5
1
7
8
9
6
Adyacentes a 7: 4, 6, 9
Recorrido: 1, 2, 4, 8, 3, 7, 9, 5 , 6


ED 2008/09 43
4.3.2 Recorrido en Anchura
procedimiento recorrido(G)
para cada v - N hacer
marca[v] - no visitado
fpara
para cada v - N hacer
si marca[v] = visitado entonces
ra(v)
fsi
fpara
fprocedimiento
procedimiento ra(v)
Q - colavacia
marca[v] - visitado
poner v en Q
mientras Q no est vaca hacer
quitar aux de Q
para todo w adyacente a aux hacer
si marca[w] = visitado entonces
marca[w] - visitado
poner w en Q
fsi
fpara
fmientras
fprocedimiento
ED 2008/09 44
4.3.2 Recorrido en Anchura
GEl tiempo requerido para realizar un recorrido en
anchura de un grafo es el mismo que para un
recorrido en profundidad = (max(n,a))
GTambin genera rboles de recubrimiento. Si el
grafo es conexo = un nico rbol.
GSe emplea en exploraciones parciales de
grafos, para hallar el camino ms corto entre
dos puntos de un grafo, etc.


ED 2008/09 45
4.3.2 Recorrido en Anchura
PROCEDURE RecorreAnchura(g: TGrafo);
VAR
n: integer;
nodo: TNodo;
marca: TVisitado;
c: TipoConjuntoNodos;
BEGIN
DameNodos(g, c);{TAD grafo}
n:= Cardinal(c); {TAD Conjunto}
InicializarVisitados(marca, n); {TAD TVisitado}
WHILE NOT EsConjuntoVacio(c) DO BEGIN
DameNodo(c, nodo); {TAD Conjunto}
Quitar(c, nodo);{TAD Conjunto}
IF NOT EsVisitado(marca,nodo) THEN {TAD TVisitado}
ra(g, nodo, marca);
END;
ED 2008/09 46
4.3.2 Recorrido en Anchura
PROCEDURE ra(g:TGrafo; nodo: TNodo; VAR marca:TVisitado);
VAR q: TCola;
w, v: TNodo;
adya: TipoConjuntoNodo;
BEGIN
CrearColaVacia(q);
MarcarVisitado(marca,nodo); {TAD TVisitado}
Insertar(q,nodo);
WHILE NOT EsColaVacia(q) DO BEGIN
Desencolar(q, w);
Adyacentes(g, w, adya); {TAD grafo}
WHILE NOT EsConjuntoVacio(adya) DO BEGIN
DameNodo(adya, v); {TAD Conjunto}
Quitar(adya, v); {TAD Conjunto}
IF NOT EsVisitado(marca,v) THEN BEGIN
MarcarVisitado(marca,v); {TAD TVisitado}
Encolar(q,v);
END;
END;
END;
END;


ED 2008/09 47
4.3.2 Recorrido en Anchura
1
2 3 4
5 6 7 8
EjempIo: recorrido en anchura del siguient e
grafo no dirigido
ED 2008/09 48
4.3.2 Recorrido en Anchura
1
2 3 4
5 6 7 8
EjempIo: recorrido en anchura
Paso Nodo Visitado Q
1 1 2, 3, 4
2 2 3, 4, 5, 6
3 3 4, 5, 6
4 4 5, 6, 7, 8
5 5 6, 7, 8
6 6 7, 8
7 7 8
8 8 -


ED 2008/09 49
4.3.2 Recorrido en Anchura
rboI de recorrido en anchura:
1
2 3 4
5 6 7 8
ED 2008/09 50
4.3.2 Recorrido en Anchura
EjempIo
GSe nos da:
El valor inicial 1
Las operaciones x2 y -3 (- es divisin entera)
GEl objetivo es construir otros valores. Por
ejemplo: 10 = 1 x 2 x 2 x 2 x 2 - 3 x 2
GSe desea construir un valor concreto n:
Bsqueda en un grafo infinito
Un recorrido en profundidad podra no funcionar
Un recorrido en anchura es la mejor solucin


ED 2008/09 51
4.3.2 Recorrido en Anchura
2
1
8
4
16
5
32
10
64
21
128
3
20
6 12
40
13
80
42
256
7
85
512
14
84

También podría gustarte