Está en la página 1de 13

2.

4 Algoritmos de recorrido de grafos

l DFS: recorrido en profundidad (Depth First


Search), generalización del recorrido en
preorden de un árbol.

l BFS: recorrido en anchura (Breath First


Search), generalización del recorrido por
niveles de un árbol.

AD3 1
Recorrido en profundidad (DFS)

l Explora sistemáticamente las aristas del grafo de


forma que primero se visitan los vértices
adyacentes a los visitados más recientemente. Así
se va “profundizando” en el grafo.
l Algoritmo de recorrido en profundidad:
n Contador (n)
n Vector de naturales (R) para “marcar” los vértices ya
visitados (Rv>0) y almacenar el orden de recorrido.
Rv: orden en el que se visita el vértice v.

AD3 2
Algoritmo de Recorrido en profundidad

RP(G)
n:=0; ∀v∈V: Rv:=0; fin∀
∀v∈V: Si Rv=0 entonces DFS(v) fin∀
devolver (R)
finRP

DFS(v)
n:=n+1; Rv:=n;
∀w∈Adyacentes(v): Si Rw=0 entonces DFS(w) fin∀
finDFS

AD3 3
Ejemplo: Recorrido DFS

Nodos R
v/w 1 2 3 4 5 6 7 8 9
7 0 0 0 0 0 0 0 0 0
2 1/2,3,4,5 1 - - - - - - - -
6 2 - 2 - - - - - - -
3 3/2,6,8 - - 3 - - - - - -
1 6/7 - - - - - 4 - - -
8 7/2 - - - - - - 5 - -
4 8/6 - - - - - - - 6 -
4/3,8 - - - 7 - - - - -
5 9 5/- - - - - 8 - - - -
9/5,8 - - - - - - - - 9
R 1 2 3 7 8 4 5 6 9
AD3 4
Recorrido en profundidad en C

#define MaxNodos 128


typedef struct arist{int nodo;struct arist *sig;}Arista;
typedef Arista *grafListas[MaxNodos];
grafListas G; /* Vector de Listas de Adyacencia */
int talla;

void RP () {
int R[MaxNodos];
int v,n=0
void DFS (int v) {
int w; Arista *b;
R[v]=n++;
for (b=G[v];b!=NULL;b=b->sig) {w=b->nodo;if R[w]==0 DFS(w);}
}
for (v=1;v<=talla;v++)R[v]=0;
for (v=1;v<=talla;v++) if R[v]==0 DFS(v);
}
AD3 5
Recorrido en anchura (BFS)

l Explora sistemáticamente las aristas del grafo de


forma que primero se visitan los vértices más
“cercanos” al que estamos explorando.
l Algoritmo de recorrido en anchura:
n Contador (n)
n Vector de naturales (R) para “marcar” los vértices ya
visitados (Rv>0) y almacenar el orden de recorrido.
n Cola (Q) para gestionar los vértices no visitados

creaq(q); encolar(Q,v); primero(Q);


desencolar(Q); esvaciaq(Q)

AD3 6
Algoritmo de Recorrido en anchura

RA(G)
n:=0; ∀v∈V: Rv:=0; fin∀; creaq(Q);
∀v∈V: Si Rv=0 entonces BFS(v) fin∀
devolver (R)
finRP
BFS(v)
n:=n+1; Rv:=n;encolar(Q,v);
mientras not esvaciaq(Q)
u:=primero(Q); desencolar(Q);
∀w∈Adyacentes(v): Si Rw=0 entonces
n:=n+1; Rw:=n; encolar(Q,w) fin∀
finmientras
AD3 7
finBFS
Ejemplo: Recorrido BFS

Nodos R Q
v u w 1 2 3 4 5 6 7 8 9
1 1 0 0 0 0 0 0 0 0 <1>
1 - - - - - - - - - <>
2 - 2 - - - - - - - <2>
3 - - 3 - - - - - - <2,3>
7 4 - - - 4 - - - - - <2,3,4>
2 5 - - - - 5 - - - - <2,3,4,5>
2 - - - - - - - - - <3,4,5>
6 3 - - - - - - - - - <4,5>
3 2 - - - - - - - - - --
6 - - - - - 6 - - - <4,5,6>
8 - - - - - - - 7 - <4,5,6,8>
1 4 - - - - - - - - - <5,6,8>
3 - - - - - - - - - --
8 8 - - - - - - - - - --
4 5 - - - - - - - - - <6,8>
6 - - - - - - - - - <8>
7 - - - - - - 8 - - <8,7>
5 9 8 - - - - - - - - - <7>
6 - - - - - - - - - --
7 - - - - - - - - - <>
9 - - - - - - - - 9 <9>
9 - - - - - - - - - <>
5 - - - - - - - - - --
AD3 8 - - - - - - - - - -- 8
R 1 2 3 4 5 6 8 7 9
Recorrido en anchura en C
typedef struct arist{int nodo;struct arist *sig;}Arista;
typedef Arista *grafListas[MaxNodos];
grafListas G; /* Vector de Listas de Adyacencia */
int talla;
void RA () {
int Q[MaxNodos]; int R[MaxNodos];
int v,n=0,j=0,k=0;
void BFS (int v) {
int u,w; Arista *b;
R[v]=n++; Q[k++]=v;
while (j<k) {
u=Q[j++];
for (b=G[u];b!=NULL;b=b->sig)
{w=b->nodo;if R[w]==0 {R[w]=n++; Q[k++]=w;} }
}
}
for (v=1;v<=talla;v++)R[v]=0;
for (v=1;v<=talla;v++) if R[v]==0 BFS(v);
} AD3 9
2.5 Orden topológico en grafos dirigidos acíclicos

l En un grafo dirigido acíclico el recorrido en


profundidad puede utilizarse directamente para
ordenar los vértices según un orden (parcial) “p “
tal que u,v∈V, si (u,v)∈E, upv. Basta ir anotando en
una pila global (P) los vértices completamente
explorados por DFS.

AD3 10
Algoritmo de Ordenación Topológica

OTP(G)
n:=0; ∀v∈V: Rv:=0; fin∀; creap(P);
∀v∈V: Si Rv=0 entonces DFS(v) fin∀
devolver (R)
finRP

DFS(v)
n:=n+1; Rv:=n;
∀w∈Adyacentes(v): Si Rw=0 entonces DFS(w) fin∀;
apilar(P,v)
finDFS
AD3 11
Ejemplo: Ordenación topológica

Nodos R P
v/w 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 <>
7 1/2,3,4,5 1 - - - - - - - - <>
2 2 - 2 - - - - - - - <2>
6 3/2,6,8 - - 3 - - - - - - <2>
3 6/7 - - - - - 4 - - - <2>
7/2 - - - - - - 5 - - <7,2>
1 --- - - - - - - - - - <6,7,2>
8 8/6 - - - - - - - 6 - <8,6,7,2>
4 --- - - - - - - - - - <3,8,6,7,2>
4/3,8 - - - 7 - - - - - <4,3,8,6,7,2>
5/- - - - - 8 - - - - <5,4,3,8,6,7,2>
5 9 --- - - - - - - - - - <1,5,4,3,8,6,7,2>
9/5,8 - - - - - - - - 9 <9,1,5,4,3,8,6,7,2>

Grafo ordenado
9 1 5 4 3 8 6 7 2 topológicamente
AD3 12
Ordenación topológica en C

#define MaxNodos 128


typedef struct arist{int nodo;struct arist *sig;}Arista;
typedef Arista *grafListas[MaxNodos];
grafListas G; /* Vector de Listas de Adyacencia */
int talla;

void OTP () {
int R[MaxNodos];
int v,n=0,k=0;
void DFST (int v) {
int w; Arista *b;
R[v]=n++;
for (b=G[v];b!=NULL;b=b->sig) {w=b->nodo;if R[w]==0 DFST(w);}
P[k++]=v;
}
for (v=1;v<=talla;v++)R[v]=0;
for (v=1;v<=talla;v++) if R[v]==0 DFST(v);
} AD3 13

También podría gustarte