Anda di halaman 1dari 26

4.

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

l4.3.4 Ramificacin y Poda


4.3.4.1 Esquema de la Tcnica
4.3.4.2 Ejemplos
EDI 2008/09

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:

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.

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

l Si el grafo no es conexo, tendremos un rbol de


recubrimiento por cada componente conexa.
l La exploracin en profundidad de un grafo nos
permite numerar los nodos del grafo en preorden.

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.

l Si v es la raz del rbol y tiene ms de un hijo, 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.

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].
EDI 2008/09

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

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, (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

34

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.
EDI 2008/09

35

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.
EDI 2008/09

36

4.3.2 Recorrido en Anchura


Adyacentes a 1: 2, 4, 8

1
2

5
6
Recorrido: 1, 2, 4, 8
EDI 2008/09

37

4.3.2 Recorrido en Anchura


Adyacentes a 2: 1, 3, 4

1
2

5
6
Recorrido: 1, 2, 4, 8 , 3
EDI 2008/09

38

4.3.2 Recorrido en Anchura


Adyacentes a 4: 1, 2, 3, 7

1
2

5
6
Recorrido: 1, 2, 4, 8, 3, 7
EDI 2008/09

39

4.3.2 Recorrido en Anchura


Adyacentes a 8: 1, 9

1
2

5
6
Recorrido: 1, 2, 4, 8, 3, 7, 9
EDI 2008/09

40

4.3.2 Recorrido en Anchura


Adyacentes a 3: 2, 4, 5

1
2

5
6
Recorrido: 1, 2, 4, 8, 3, 7, 9 , 5
EDI 2008/09

41

4.3.2 Recorrido en Anchura


Adyacentes a 7: 4, 6, 9

1
2

5
6

Recorrido: 1, 2, 4, 8, 3, 7, 9, 5 , 6
EDI 2008/09

42

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
EDI 2008/09

43

4.3.2 Recorrido en Anchura


l El tiempo requerido para realizar un recorrido en
anchura de un grafo es el mismo que para un
recorrido en profundidad   (max(n,a))
l Tambin genera rboles de recubrimiento. Si el
grafo es conexo  un nico rbol.
l Se emplea en exploraciones parciales de
grafos, para hallar el camino ms corto entre
dos puntos de un grafo, etc.

EDI 2008/09

44

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;
EDI 2008/09

45

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;
EDI 2008/09
END;

46

4.3.2 Recorrido en Anchura


Eje m p lo: recorrido en anchura del siguient e
grafo no dirigido
1

EDI 2008/09

47

4.3.2 Recorrido en Anchura


Ejemplo: recorrido en anchura
Paso
1
2
3
4
5
6
7
8

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

4.3.2 Recorrido en Anchura


rbol de recorrido en anchura:

EDI 2008/09

49
8

4.3.2 Recorrido en Anchura


Ejemplo
l Se nos da:
 El valor inicial 1
 Las operaciones x2 y 3 ( es divisin entera)

l El objetivo es construir otros valores. Por


ejemplo: 10 = 1 x 2 x 2 x 2 x 2 3 x 2
l Se 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
EDI 2008/09

50

4.3.2 Recorrido en Anchura


512
256
85

128
64

84
42
21

32

14

........

7
8

16
80
40
20
5

13

10
EDI 2008/09

12

51

Anda mungkin juga menyukai