Documentos de Académico
Documentos de Profesional
Documentos de Cultura
AD3 1
Recorrido en profundidad (DFS)
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
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)
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
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
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