Você está na página 1de 67

Algoritmos em Grafos: Busca em

Profundidade
Letcia Rodrigues Bueno
UFABC

Problema 1: Ordenao Topolgica


grafos direcionados acclicos: usados para indicar

precedncias entre eventos;

Problema 1: Ordenao Topolgica


grafos direcionados acclicos: usados para indicar

precedncias entre eventos;


ordenao topolgica: ordenao linear tal que arestas

orientadas sigam da esquerda para direita (pode haver


vrias);

Problema 1: Ordenao Topolgica


grafos direcionados acclicos: usados para indicar

precedncias entre eventos;


ordenao topolgica: ordenao linear tal que arestas

orientadas sigam da esquerda para direita (pode haver


vrias);
Socks

Shoes

Underwear

Suit

Watch

Pants

Belt
Tie

Shirt

Problema 1: Ordenao Topolgica


grafos direcionados acclicos: usados para indicar

precedncias entre eventos;


ordenao topolgica: ordenao linear tal que arestas

orientadas sigam da esquerda para direita (pode haver


vrias);
Socks

Shoes

Underwear

Suit

Watch

Pants

Belt

Shirt

Tie

Socks

Underwear

Pants

Shoes

Watch

Shirt

Belt

Tie

Suit

Busca em Profundidade (DFS - Depth-First Search)

Como encontrar uma ordenao topolgica em um grafo


direcionado acclico?

Busca em Profundidade (DFS - Depth-First Search)

Como encontrar uma ordenao topolgica em um grafo


direcionado acclico?
Usaremos a busca em profundidade!

Busca em Profundidade (DFS - Depth-First Search)

a
b
g

d
e

Busca em Profundidade (DFS - Depth-First Search)

b
g

d
e

Busca em Profundidade (DFS - Depth-First Search)

d
e

b
a

Busca em Profundidade (DFS - Depth-First Search)

d
e

c
b
a

Busca em Profundidade (DFS - Depth-First Search)

d
c
b
a

Busca em Profundidade (DFS - Depth-First Search)

e
d
c
b
a

Busca em Profundidade (DFS - Depth-First Search)

e
d
c
b
a

Busca em Profundidade (DFS - Depth-First Search)

f
d
c
b
a

Busca em Profundidade (DFS - Depth-First Search)

g
f
d
c
b
a

Busca em Profundidade (DFS - Depth-First Search)

g
f
d
c
b
a

Busca em Profundidade (DFS - Depth-First Search)

g
f
d
c
b
a

Busca em Profundidade (DFS - Depth-First Search)

g
f
d
c
b
a

Busca em Profundidade (DFS - Depth-First Search)

f
d
c
b
a

Busca em Profundidade (DFS - Depth-First Search)

d
c
b
a

Busca em Profundidade (DFS - Depth-First Search)

c
b
a

Busca em Profundidade (DFS - Depth-First Search)

b
a

Busca em Profundidade (DFS - Depth-First Search)

Busca em Profundidade (DFS - Depth-First Search)

Algoritmo DFS
1 dfs(G, u, cont):
2
u.visitado = True
3
u.d = cont
4
para v em adj(u) faa
5
se no v.visitado ento
6
v.p = u
7
dfs(G, v, cont+1)

8 para u em V(G) faa


9
u.visitado = False
10
u.d =
11
u.p = None
12 cont = 1
13 dfs(G, u, cont)

Algoritmo DFS
1 dfs(G, u, cont):
2
u.visitado = True
3
u.d = cont
4
para v em adj(u) faa
5
se no v.visitado ento
6
v.p = u
7
dfs(G, v, cont+1)

8 para u em V(G) faa


9
u.visitado = False
10
u.d =
11
u.p = None
12 cont = 1
13 dfs(G, u, cont)

Anlise da complexidade:

Algoritmo DFS
1 dfs(G, u, cont):
2
u.visitado = True
3
u.d = cont
4
para v em adj(u) faa
5
se no v.visitado ento
6
v.p = u
7
dfs(G, v, cont+1)

8 para u em V(G) faa


9
u.visitado = False
10
u.d =
11
u.p = None
12 cont = 1
13 dfs(G, u, cont)

Anlise da complexidade:
Cada vrtice passado
para mtodo dfs (linha
7 e 13): O(n)

Algoritmo DFS
1 dfs(G, u, cont):
2
u.visitado = True
3
u.d = cont
4
para v em adj(u) faa
5
se no v.visitado ento
6
v.p = u
7
dfs(G, v, cont+1)

8 para u em V(G) faa


9
u.visitado = False
10
u.d =
11
u.p = None
12 cont = 1
13 dfs(G, u, cont)

Anlise da complexidade:
Cada vrtice passado
para mtodo dfs (linha
7 e 13): O(n)
A lista de adjacncia
de cada vrtice
percorrida uma vez
(linha 4): O(m)

Algoritmo DFS
1 dfs(G, u, cont):
2
u.visitado = True
3
u.d = cont
4
para v em adj(u) faa
5
se no v.visitado ento
6
v.p = u
7
dfs(G, v, cont+1)

8 para u em V(G) faa


9
u.visitado = False
10
u.d =
11
u.p = None
12 cont = 1
13 dfs(G, u, cont)

Anlise da complexidade:
Cada vrtice passado
para mtodo dfs (linha
7 e 13): O(n)
A lista de adjacncia
de cada vrtice
percorrida uma vez
(linha 4): O(m)
Complexidade total:
O(n + m)

Ordenao Topolgica

Voltando ao problema de ordenao topolgica:

Ordenao Topolgica

Voltando ao problema de ordenao topolgica:


Como usar DFS para resolv-lo?

Ordenao Topolgica

Voltando ao problema de ordenao topolgica:


Como usar DFS para resolv-lo?
Lema
Um grafo direcionado acclico sempre contm um vrtice de
grau de entrada 0.

Ordenao Topolgica

Voltando ao problema de ordenao topolgica:


Como usar DFS para resolv-lo?
Lema
Um grafo direcionado acclico sempre contm um vrtice de
grau de entrada 0.
Demonstrao.
Se todo vrtice tem grau de entrada maior que 0, podemos
andar pelas arestas de trs para frente sem parar. H uma
quantidade finita de vrtices, portanto fazemos isso em um
ciclo, mas grafo acclico no tem ciclos.

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Underwear

Suit

Watch

Pants

Belt
Tie

pt

Shirt

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Underwear

Suit

Watch

Pants

Belt
Tie

pt

Shirt

pants

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Underwear

Suit

Watch

Pants

Belt
Tie

pt

Shirt

shoes
pants

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Underwear

Suit

Watch

Pants

Belt
Tie

pt

shoes

Shirt

pants

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Underwear

Suit

Watch

Pants

Belt
Tie

pt

shoes

Shirt

belt
pants

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Underwear

Suit

Watch

Pants

Belt
Tie

pt

shoes

Shirt

suit
belt
pants

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Watch

Pants

Underwear

Suit

Belt
Tie

pt

suit

shoes

Shirt

belt
pants

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Underwear

Suit

Watch

Pants

Belt
Tie

pt

belt

suit

shoes

Shirt

pants

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Watch

Pants

Underwear

Suit

Shirt

Belt
Tie

pt

pants

belt

suit

shoes

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Watch

Pants

Underwear

Suit

Shirt

Belt
Tie

pt

pants

belt

suit

shoes

tie

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Underwear

Suit

Watch

Pants

Shirt

Belt
Tie

pt

tie

pants

belt

suit

shoes

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Underwear

Suit

Watch

Pants

Shirt

Belt
Tie

pt

tie

pants

belt

suit

shirt

shoes

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Underwear

Suit

Watch

Pants

Shirt

Belt
Tie

pt

shirt

tie

pants

belt

suit

shoes

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Underwear

Suit

Watch

Pants

Shirt

Belt
Tie

pt

shirt

tie

pants

belt

watch

suit

shoes

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Watch

Pants

Underwear

Suit

Shirt

Belt
Tie

pt

watch

shirt

tie

pants

belt

suit

shoes

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Watch

Pants

Underwear

Suit

Shirt

Belt
Tie

pt

watch

shirt

tie

pants

socks

belt

suit

shoes

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Underwear

Watch

Pants

Suit

Shirt

Belt
Tie

pt

socks

watch

shirt

tie

pants

belt

suit

shoes

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Underwear

Watch

Pants

Suit

Shirt

Belt
Tie

pt

socks

watch

shirt

tie

underwear

pants

belt

suit

shoes

Busca em Profundidade (DFS - Depth-First Search)

Socks

Shoes

Underwear

Suit

Watch

Pants

Shirt

Belt
Tie

pt

underwear

socks

watch

shirt

tie

pants

belt

suit

shoes

Algoritmo Ordenao Topolgica

1 dfs(G, u):
2
u.visitado = True
3
para v em adj(u) faa
4
se no v.visitado ento
5
dfs(G, v)
6
inserePrimeiro(L, u)

7 para u em V(G) faa


8
u.visitado = False
9 L = Lista();
10 para u em V(G) faa
11
se no u.visitado ento
12
dfs(G, u)

Algoritmo Ordenao Topolgica


Anlise da complexidade:
1 dfs(G, u):
2
u.visitado = True
3
para v em adj(u) faa
4
se no v.visitado ento
5
dfs(G, v)
6
inserePrimeiro(L, u)

7 para u em V(G) faa


8
u.visitado = False
9 L = Lista();
10 para u em V(G) faa
11
se no u.visitado ento
12
dfs(G, u)

Algoritmo Ordenao Topolgica


Anlise da complexidade:
1 dfs(G, u):
2
u.visitado = True
3
para v em adj(u) faa
4
se no v.visitado ento
5
dfs(G, v)
6
inserePrimeiro(L, u)

7 para u em V(G) faa


8
u.visitado = False
9 L = Lista();
10 para u em V(G) faa
11
se no u.visitado ento
12
dfs(G, u)

Cada vrtice passado


para mtodo dfs (linha
5 e 12): O(n)

Algoritmo Ordenao Topolgica


Anlise da complexidade:
1 dfs(G, u):
2
u.visitado = True
3
para v em adj(u) faa
4
se no v.visitado ento
5
dfs(G, v)
6
inserePrimeiro(L, u)

7 para u em V(G) faa


8
u.visitado = False
9 L = Lista();
10 para u em V(G) faa
11
se no u.visitado ento
12
dfs(G, u)

Cada vrtice passado


para mtodo dfs (linha
5 e 12): O(n)
A lista de adjacncia
de cada vrtice
percorrida uma vez
(linha 3): O(m)

Algoritmo Ordenao Topolgica


Anlise da complexidade:
1 dfs(G, u):
2
u.visitado = True
3
para v em adj(u) faa
4
se no v.visitado ento
5
dfs(G, v)
6
inserePrimeiro(L, u)

7 para u em V(G) faa


8
u.visitado = False
9 L = Lista();
10 para u em V(G) faa
11
se no u.visitado ento
12
dfs(G, u)

Cada vrtice passado


para mtodo dfs (linha
5 e 12): O(n)
A lista de adjacncia
de cada vrtice
percorrida uma vez
(linha 3): O(m)
inserePrimeiro insere
no incio de lista
ligada: O(1);

Algoritmo Ordenao Topolgica


Anlise da complexidade:
1 dfs(G, u):
2
u.visitado = True
3
para v em adj(u) faa
4
se no v.visitado ento
5
dfs(G, v)
6
inserePrimeiro(L, u)

7 para u em V(G) faa


8
u.visitado = False
9 L = Lista();
10 para u em V(G) faa
11
se no u.visitado ento
12
dfs(G, u)

Cada vrtice passado


para mtodo dfs (linha
5 e 12): O(n)
A lista de adjacncia
de cada vrtice
percorrida uma vez
(linha 3): O(m)
inserePrimeiro insere
no incio de lista
ligada: O(1);
Complexidade total:
O(n + m)

Algoritmo Ordenao Topolgica


1 dfs(G, u):
2
u.visitado = True
3
para v em adj(u) faa
4
se no v.visitado ento
5
dfs(G, v)
6
inserePrimeiro(L, u)

7 para u em V(G) faa


8
u.visitado = False
9 L = Lista();
10 para u em V(G) faa
11
se no u.visitado ento
12
dfs(G, u)

Algoritmo Ordenao Topolgica


1 dfs(G, u):
2
u.visitado = True
3
para v em adj(u) faa
4
se no v.visitado ento
5
dfs(G, v)
6
inserePrimeiro(L, u)

7 para u em V(G) faa


8
u.visitado = False
9 L = Lista();
10 para u em V(G) faa
11
se no u.visitado ento
12
dfs(G, u)

Anlise da corretude:

Algoritmo Ordenao Topolgica


1 dfs(G, u):
2
u.visitado = True
3
para v em adj(u) faa
4
se no v.visitado ento
5
dfs(G, v)
6
inserePrimeiro(L, u)

7 para u em V(G) faa


8
u.visitado = False
9 L = Lista();
10 para u em V(G) faa
11
se no u.visitado ento
12
dfs(G, u)

Anlise da corretude:
Vrtices so
adicionados no
comeo da lista
somente se no tem
mais arestas de sada;

Algoritmo Ordenao Topolgica


1 dfs(G, u):
2
u.visitado = True
3
para v em adj(u) faa
4
se no v.visitado ento
5
dfs(G, v)
6
inserePrimeiro(L, u)

7 para u em V(G) faa


8
u.visitado = False
9 L = Lista();
10 para u em V(G) faa
11
se no u.visitado ento
12
dfs(G, u)

Anlise da corretude:
Vrtices so
adicionados no
comeo da lista
somente se no tem
mais arestas de sada;
Sumidouros so
adicionados primeiro;

Algoritmo Ordenao Topolgica


1 dfs(G, u):
2
u.visitado = True
3
para v em adj(u) faa
4
se no v.visitado ento
5
dfs(G, v)
6
inserePrimeiro(L, u)

7 para u em V(G) faa


8
u.visitado = False
9 L = Lista();
10 para u em V(G) faa
11
se no u.visitado ento
12
dfs(G, u)

Anlise da corretude:
Vrtices so
adicionados no
comeo da lista
somente se no tem
mais arestas de sada;
Sumidouros so
adicionados primeiro;
Depois, so
adicionados vrtices
satisfeitos;

Algoritmo Ordenao Topolgica


1 dfs(G, u):
2
u.visitado = True
3
para v em adj(u) faa
4
se no v.visitado ento
5
dfs(G, v)
6
inserePrimeiro(L, u)

7 para u em V(G) faa


8
u.visitado = False
9 L = Lista();
10 para u em V(G) faa
11
se no u.visitado ento
12
dfs(G, u)

Anlise da corretude:
Vrtices so
adicionados no
comeo da lista
somente se no tem
mais arestas de sada;
Sumidouros so
adicionados primeiro;
Depois, so
adicionados vrtices
satisfeitos;
Finalmente, fontes so
adicionadas;

Exerccios

1. Modifique o algoritmo DFS para verificar se um grafo


acclico.
2. Supondo que G seja conexo, como podemos usar o
algoritmo DFS para obter uma rvore geradora do grafo
G?
3. O algoritmo DFS pode ser usado para checar se um grafo
conexo?
4. Proponha um algoritmo alternativo para resolver o
problema de ordenao topolgica sem utilizar DFS mas
que tenha mesma complexidade de tempo.

Bibliografia

CORMEN, T. H.; LEISERSON, C. E.; RIVEST, R. L. e STEIN, C.


Introduction to Algorithms, 3a edio, MIT Press, 2009.

Você também pode gostar