3 Exploracin de grafos
l 4.3.1 Recorrido en Profundidad
l 4.3.2 Recorrido en Anchura
l 4.3.3 Vuelta Atrs
4.3.3.1 Esquema de la Tcnica
4.3.3.2 Ejemplos
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 (vi, vj)
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 <no, nd>
EDI 2008/09
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.
EDI 2008/09
4.3.1 Recorrido en
Profundidad
Pasos del Algoritmo:
EDI 2008/09
4.3.1 Recorrido en
Profundidad
1
2
5
6
EDI 2008/09
4.3.1 Recorrido en
Profundidad
Adyacentes a 1: 2, 4, 8
1
2
5
6
Recorrido: 1, 2
EDI 2008/09
4.3.1 Recorrido en
Profundidad
Adyacentes a 2: 1, 3, 4
1
2
5
6
Recorrido: 1, 2, 3
EDI 2008/09
4.3.1 Recorrido en
Profundidad
Adyacentes a 3: 2, 4, 5
1
2
5
6
Recorrido: 1, 2, 3 , 4
EDI 2008/09
4.3.1 Recorrido en
Profundidad
Adyacentes a 4: 1, 2, 3, 7
1
2
5
6
Recorrido: 1, 2, 3, 4 , 7
EDI 2008/09
4.3.1 Recorrido en
Profundidad
Adyacentes a 7: 4, 6, 9
1
2
5
6
Recorrido: 1, 2, 3, 4, 7, 6
EDI 2008/09
10
4.3.1 Recorrido en
Profundidad
Adyacentes a 6: 5, 7
1
2
5
6
Recorrido: 1, 2, 3, 4, 7, 6, 5
EDI 2008/09
11
4.3.1 Recorrido en
Profundidad
Adyacentes a 5: 3, 6
1
2
5
6
Recorrido: 1, 2, 3, 4, 7, 6, 5
EDI 2008/09
12
4.3.1 Recorrido en
Profundidad
Adyacentes a 6: 5, 7
1
2
5
6
Recorrido: 1, 2, 3, 4, 7, 6, 5
EDI 2008/09
13
4.3.1 Recorrido en
Profundidad
Adyacentes a 7: 4, 6, 9
1
2
5
6
Recorrido: 1, 2, 3, 4, 7, 6, 5 , 9
EDI 2008/09
14
4.3.1 Recorrido en
Profundidad
Adyacentes a 9: 7, 8
1
2
5
6
Recorrido: 1, 2, 3, 4, 7, 6, 5, 9 , 8
EDI 2008/09
15
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
EDI 2008/09
16
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;
EDI 2008/09
17
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;
EDI 2008/09
18
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))
EDI 2008/09
19
4.3.1 Recorrido en
Profundidad
l El 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
EDI 2008/09
20
4.3.1 Recorrido en
Profundidad
Eje m p lo:
recorrido en
siguient e grafo no dirigido
profundidad
del
EDI 2008/09
21
4.3.1 Recorrido en
Profundidad
Secuencia de llamadas 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}
1
EDI 2008/09
22
8
4.3.1 Recorrido en
Profundidad
rbol de recorrido en profundidad (T):
EDI 2008/09
23
8
4.3.1 Recorrido en
Profundidad
l Puntos de articulacin: 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.
l Grafo biconexo (o no articulado): aquel grafo
conexo que no tiene puntos de articulacin.
l Grafo bicoherente (o 2-arista conexo): aquel
grafo cuyos puntos de articulacin estn unidos a
cada componente del subgrafo restante por, al
menos, dos aristas.
EDI 2008/09
24
4.3.1 Recorrido en
Profundidad
l Si 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.
EDI 2008/09
25
4.3.1 Recorrido en
Profundidad
l Clculo de puntos de articulacin:
l preNum[v]: es el nmero asignado a cada vrtice v
en el recorrido en profundidad del grafo (recorrido
en preorden del rbol).
l masAlto[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].
EDI 2008/09
26
4.3.1 Recorrido en
Profundidad
Clculo de puntos de articulacin:
A la izquierda de cada vrtice v
se representa preNum[v]
A la derecha de cada vrtice v
se representa masAlto[v]
EDI 2008/09
27
8
4.3.1 Recorrido en
Profundidad
l Clculo de puntos de articulacin:
l Sea 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.
EDI 2008/09
28
4.3.1 Recorrido en
Profundidad
Procedimiento para el clculo de puntos de
articulacin:
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.
29
4.3.1 Recorrido en
Profundidad
l Si 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
l En un grafo dirigido, el nodo w es adyacente a otro
nodo v si existe la arista dirigida <v,w>.
l Si existe <v,w> pero no existe <w,v>, w es
adyacente a v pero v no es adyacente a w.
EDI 2008/09
30
4.3.1 Recorrido en
Profundidad
Eje m p lo:
recorrido en
siguient e grafo dirigido
profundidad
EDI 2008/09
del
31
4.3.1 Recorrido en
Profundidad
Secuencia de llamadas 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}
EDI 2008/09
32
4.3.1 Recorrido en
Profundidad
Bosque de recorrido en profundidad:
EDI 2008/09
33
34
35
36
1
2
5
6
Recorrido: 1, 2, 4, 8
EDI 2008/09
37
1
2
5
6
Recorrido: 1, 2, 4, 8 , 3
EDI 2008/09
38
1
2
5
6
Recorrido: 1, 2, 4, 8, 3, 7
EDI 2008/09
39
1
2
5
6
Recorrido: 1, 2, 4, 8, 3, 7, 9
EDI 2008/09
40
1
2
5
6
Recorrido: 1, 2, 4, 8, 3, 7, 9 , 5
EDI 2008/09
41
1
2
5
6
Recorrido: 1, 2, 4, 8, 3, 7, 9, 5 , 6
EDI 2008/09
42
43
EDI 2008/09
44
45
46
EDI 2008/09
47
Nodo Visitado
1
2
3
4
5
6
7
8
Q
2,
3,
4,
5,
6,
7,
8
-
3,
4,
5,
6,
7,
8
EDI 2008/09
4
5, 6
6
7, 8
8
1
48
EDI 2008/09
49
8
50
128
64
84
42
21
32
14
........
7
8
16
80
40
20
5
13
10
EDI 2008/09
12
51