Professional Documents
Culture Documents
v Introducción 2
v Recorrido en profundidad 3
v Recorrido en anchura 9
v Ordenación topológica 12
v Justificación de la necesidad:
Programas que precisan aplicar sistemáticamente
un tratamiento a todos los vértices de un grafo
(visitar todos los vértices).
v Consideraciones generales:
No importa el orden de visita ⇒
⇒ para todo v en vért hacer...
2 casos
• recorrido en profundidad
• recorrido en anchura
• recorrido por ordenación topológica
v Terminología:
– Sucesores transitivos de un nodo: descendientes.
– Predecesores transitivos: antecesores.
v Aplicaciones:
– analizar la robustez de una red de computadores
representada por un grafo no dirigido
[AHU88, pp. 243-245]
– examinar si un grafo dirigido tiene ciclos, antes
de aplicar sobre él cualquier algoritmo que exija
que sea acíclico
{Pre:
{Pre:gges
esun
ungrafo
grafodirigido
dirigidoyyno
noetiquetado}
etiquetado}
función
funciónrecorEnProf(g:grafo)
recorEnProf(g:grafo)
devuelve
devuelvelistaVért
listaVért
variables
variablesS:cjtVért;
S:cjtVért;{conjunto
{conjuntode
devért.}
vért.}
v:vért;
v:vért;
l:listaVért
l:listaVért
principio
principio
S:=∅;
S:=∅;
creaVacía(l);
creaVacía(l);
para
paratodo todovven envért
vérthacer
hacer
sisivv∉∉SS
entonces
entoncesvisitaComponente(g,v,S,l)
visitaComponente(g,v,S,l)
fsi
fsi
fpara
fpara
devuelve
devuelvel l
fin
fin
{Post:
{Post:esRecorEnProf(l,g)}
esRecorEnProf(l,g)}
D E F
6,5 5,3 4,1
v Coste temporal:
depende exclusivamente de la
implementación elegida para el grafo
– listas (múltiples o no) de adyacencia: Θ(a+n)
(dado un vértice siempre se consultan las aristas
que parten de él, aunque no se visite más que
una vez; el factor n aparece por si el grafo tiene
menos aristas que vértices)
– matriz de adyacencia: Θ(n2)
(por el tiempo lineal de la operación suc)
{Pre:
{Pre:gges
esun
ungrafo
grafodirigido
dirigidoyyno
noetiquetado}
etiquetado}
función
funciónrecorEnAnch(g:grafo)
recorEnAnch(g:grafo)
devuelve
devuelvelistaVért
listaVért
variables
variablesS:cjtVért;
S:cjtVért;{conjunto
{conjuntode
devért.}
vért.}
v:vért;
v:vért;
l:listaVért
l:listaVért
principio
principio
S:=∅;
S:=∅;
creaVacía(l);
creaVacía(l);
para
paratodo todovven envért
vérthacer
hacer
sisivv∉∉SS
entonces
entoncesvisitaComponente(g,v,S,l)
visitaComponente(g,v,S,l)
fsi
fsi
fpara
fpara
devuelve
devuelvel l
fin
fin
{Post:
{Post:esRecorEnAnch(l,g)}
esRecorEnAnch(l,g)}
{Pre:
{Pre:gges
esun
ungrafo
grafodirigido,no
dirigido,noetiquetado
etiquetadoyy
acíclico}
acíclico}
función
funciónordTopológica(g:grafo)
ordTopológica(g:grafo)
devuelve
devuelvelistaVért
listaVért
variable
variablel:listaVért;
l:listaVért;v,w:vért
v,w:vért
principio
principio
creaVacía(l);
creaVacía(l);
mq
mqqueden
quedennodos
nodospor porvisitar
visitarhacer
hacer
escoger
escogerv∉l v∉lt.q.
t.q.todos
todossus
suspred.
pred.
estén
esténenenl;l;
inserta(l,v)
inserta(l,v)
fmq
fmq
devuelve
devuelvel l
fin
fin
{Post:
{Post:esOrdTopológica(l,g)}
esOrdTopológica(l,g)}
{Pre:
{Pre:gges
esun
ungrafo
grafodirigido,no
dirigido,noetiquetado
etiquetadoyy
acíclico}
acíclico}
función
funciónordTopológica(g:grafo)
ordTopológica(g:grafo)
devuelve
devuelvelistaVért
listaVért
variables
variablesl:listaVért;
l:listaVért;v,w:vért;
v,w:vért;
ceros:cjtVért;
ceros:cjtVért;númPred:vector[vért]de
númPred:vector[vért]denat
nat
principio
principio
{inicializ.
{inicializ.de
delas
lasestructuras
estructurasen
endos
dospasos}
pasos}
ceros:=∅;
ceros:=∅;
para
paratodo todovven
envért
vérthacer
hacer
númPred[v]:=0;
númPred[v]:=0;ceros:=ceros∪{v}
ceros:=ceros∪{v}
fpara;
fpara;
para
paratodo todovven
envért
vérthacer
hacer
para
paratodo
todowwen
ensuc(g,v)
suc(g,v)hacer
hacer
númPred[w]:=númPred[w]+1;
númPred[w]:=númPred[w]+1;
ceros:=ceros-{w}
ceros:=ceros-{w}
fpara
fpara
fpara;
fpara;
......
......
{visita
{visitaaalos
losvértices
vérticesdel
delgrafo}
grafo}
creaVacía(l);
creaVacía(l);
mq
mqceros?∅
ceros?∅hacer
hacer (∗)
<ceros,v>:=escogerUnoCualquiera(ceros);
<ceros,v>:=escogerUnoCualquiera(ceros);
inserta(l,v);
inserta(l,v);
para
paratodo
todowwenensuc(g,v)
suc(g,v)hacer
hacer
númPred[w]:=númPred[w]-1;
númPred[w]:=númPred[w]-1;
sisinúmPred[w]=0
númPred[w]=0
entonces
entoncesceros:=ceros∪{w}
ceros:=ceros∪{w}
fsi
fsi
fpara
fpara
fmq;
fmq;
devuelve
devuelvel l
fin
fin
{Post:
{Post:esOrdTopológica(l,g)}
esOrdTopológica(l,g)}
v Coste temporal:
– inicialización:
u primer bucle: Θ(n)