Anda di halaman 1dari 608

Buscas em grafos

Busca: um processo sistemtico (algoritmo)


utilizado para percorrer (visitar) os vrtices e
arestas de um grafo.
A ideia explorar o grafo de modo a resolver
um problema ou extrair informaes de sua
estrutura.

Buscas que estudaremos:


Busca em profundidade (depth-first search)
Busca em largura (breadth-first search)

Busca em profundidade
Inicializao
t0

-- t o relgio ou tempo global

para todo vrtice v em V(G) faa


PE(v) 0
-- PE(v) a profundidade de entrada de v
PS (v) 0
-- PS(v) a profundidade de sada de v
pai(v) null -- ponteiros que definem a rvore de profundidade

Chamada Externa
escolher um vrtice qualquer v em V(G) -- este vrtice chamado raiz da busca
executar P(v)

Busca em profundidade
Procedimento recursivo de busca
procedimento P(v)
tt+1
PE(v) t
para todo vrtice w em N(v) faa
se PE(w) = 0
visitar aresta vw
ento
pai(w) v
executar P(w)
seno
fim-para
tt+1
PS(v) t
fim-do-procedimento

(aresta azul da rvore de profundidade T )


(v o pai de w na rvore de profundidade T)

se PS(w) = 0 e w pai(v)
(se w no saiu da busca e no pai de v)
ento visitar aresta vw (aresta vermelha de retorno)

Busca em profundidade
G
a

Busca em profundidade
G
a

PE(v)

PS(v)

Busca em profundidade
G
a

PE(v)

PS(v)

Busca em profundidade
G
a

g
P(e)
v

PE(v)

PS(v)

Busca em profundidade
G
a

g
P(e)
v

PE(v)

PS(v)

Busca em profundidade
G

g
P(e)
v

PE(v)

PS(v)

Busca em profundidade
G

g
P(e) N(e) = {c, d, f, g}
v

PE(v)

PS(v)

Busca em profundidade
G

g
P(e) N(e) = {c, d, f, g}
v

PE(v)

PS(v)

Busca em profundidade
G

g
P(e) N(e) = {c, d, f, g}
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c)

PE(v)

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c)

PE(v)

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c)

PE(v)

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}

PE(v)

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}

PE(v)

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}

PE(v)

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}

PE(v)

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a)

PE(v)

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a)

PE(v)

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a)

PE(v)

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}

PE(v)

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}

PE(v)

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b)

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b)

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b)

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d)

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d)

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d)

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f )

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f )

d
v

PE(v)

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f )

d
v

PE(v)

10

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}

d
v

PE(v)

10

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}

d
v

PE(v)

10

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}

d
v

PE(v)

10

PS(v)

Busca em profundidade
G

e
c

a
b

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}

d
v

PE(v)

10

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}

d
v

PE(v)

10

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}
P(g)

d
v

PE(v)

10

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}
P(g)

d
v

PE(v)

10

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}
P(g)

d
v

PE(v)

10

11

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}
P(g) N(g) = {e, f}

d
v

PE(v)

10

11

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}
P(g) N(g) = {e, f}

d
v

PE(v)

10

11

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}
P(g) N(g) = {e, f}

d
v

PE(v)

10

11

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}
P(g) N(g) = {e, f}

d
v

PE(v)

10

11

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}
P(g) N(g) = {e, f}

d
v

PE(v)

10

11

PS(v)

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}
P(g) N(g) = {e, f}

d
v

PE(v)

10

11

PS(v)

12

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}
P(g) N(g) = {e, f}

d
v

PE(v)

10

11

PS(v)

13

12

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}
P(g) N(g) = {e, f}

d
v

PE(v)

10

11

PS(v)

13

12

Busca em profundidade
G

e
c

g
P(e) N(e) = {c, d, f, g}
P(c) N(c) = {a, b, d, e}
P(a) N(a) = {b, c}
P(b) N(b) = {a, c, d}
P(d) N(d) = {b, c, e}
P(f ) N(f ) = {e, g}
P(g) N(g) = {e, f}

d
v

PE(v)

10

11

PS(v)

14

13

12

Busca em profundidade
Esgotar o filho antes de esgotar o pai

A prxima aresta a ser visitada parte sempre do


vrtice mais recente na busca

Busca em profundidade
Complexidade da busca em profundidade:

O(n + m)
( onde n = V(G) e m = E(G) )

Busca em profundidade
Se o grafo for desconexo, a busca alcanar
apenas os vrtices que esto conectados ao
vrtice-raiz da busca por caminhos!!
Alternativa:
modificar a chamada externa para alcanar todo o grafo
enquanto existe v em V(G) tal que PE(v) = 0 faa
executar P(v)

Busca em profundidade
Uma rvore um grafo conexo e acclico (sem ciclos).

Se o grafo de entrada G conexo, a rvore de


profundidade T uma rvore geradora de G (isto ,
uma rvore que alcana todos os vrtices de G); neste
caso, todos os vrtices de G so alcanados pela busca e
ficam com uma PE diferente de zero no final da mesma.
Somente as arestas azuis (ligando pai e filho)
pertencem arvore de profundidade T. As arestas
vermelhas (arestas de retorno) no pertencem a T.

Busca em profundidade
Propriedades das arestas de retorno
Toda aresta de retorno fecha um ciclo.
Toda aresta de retorno liga um vrtice v a um de seus
ancestrais na rvore de profundidade T.

Busca em profundidade

PE(v)

10

11

PS(v)

14

13

12

10

11

12

13

a
b
c
d
e
f
g
Intervalos de vida dos vrtices: v descendente de w na rvore de profundidade T se e
somente se o intervalo de vida de v est contido no intervalo de vida de w.
Isto : PE(v) > PE(w) e PS(v) < PS(w) ( v entra depois e sai antes de w ).

14

Busca em profundidade
Aplicao 1: Dado um grafo G, verificar se G conexo.

Soluo: Rodar o lao abaixo.


c0
enquanto existe v em V(G) tal que PE(v) = 0 faa
cc+1
executar P(v)
fim-enquanto
No final da execuo, a varivel c igual ao nmero de
componentes conexas de G (subgrafos conexos maximais
que compem G).

Busca em profundidade
Aplicao 2: Dado um grafo G e dois vrtices v, w de G,
verificar se existe um caminho de v a w em G.
Soluo: Basta executar uma nica vez o procedimento
P(v). No final da execuo, se PE(w) = 0 ento w no foi
alcanado pela busca com raiz v, isto , w est em uma
componente conexa diferente da de v, e portanto no existe
caminho de v a w em G. Caso contrrio, se PE(w) 0,
ento w foi alcanado, e existe um caminho de v a w em G;
neste caso, w ser descendente de v na rvore de
profundidade T, e para determinar o caminho basta rodar o
algoritmo a seguir.

Busca em profundidade
Aplicao 2: Dado um grafo G e dois vrtices v, w de G,
verificar se existe um caminho de v a w em G.
Soluo (continuao):
xw
Cx
enquanto x v faa
x pai(x)
colocar x esquerda em C
fim-enquanto
imprimir C
Obs: C no necessariamente o melhor

Busca em profundidade
Aplicao 3: Dado um labirinto, determinar um caminho
da entrada at a sada (se existir).

Busca em profundidade
Aplicao 3 - Soluo: Montar o grafo correspondente ao
labirinto e usar a soluo da aplicao anterior.

Busca em profundidade
Aplicao 3 - Soluo: Montar o grafo correspondente ao
labirinto e usar a soluo da aplicao anterior.

Busca em profundidade
Aplicao 3 - Soluo: Montar o grafo correspondente ao
labirinto e usar a soluo da aplicao anterior.

Busca em profundidade
Aplicao 3 - Soluo: Montar o grafo correspondente ao
labirinto e usar a soluo da aplicao anterior.
v

Busca em profundidade
Aplicao 4: Dado um grafo G, encontrar um ciclo de G
ou concluir que G acclico.
Soluo: Executar uma busca em profundidade em G.
Teremos dois casos:
A busca no gerou nenhuma aresta de retorno.
Ento, G acclico, e as arestas azuis formam uma
floresta geradora (um conjunto de rvores, uma
para cada componente conexa).
A busca gerou uma aresta de retorno vw. Ento, v
descendente de w na rvore, e um ciclo C formado.
Para determinar C, basta rodar o algoritmo a seguir:

Busca em profundidade
Aplicao 4: Dado um grafo G, encontrar um ciclo de G
ou concluir que G acclico.
Soluo (continuao):
xv
Cx
enquanto x w faa
x pai(x)
colocar x direita em C
fim-enquanto
colocar v direita em C (para fechar o ciclo)
imprimir C

Busca em profundidade
Aplicao 5: Dado um grafo G, decidir se G 2-colorvel.

Um grafo G 2-colorvel (ou bipartido) se podemos


colorir os vrtices de G com duas cores de modo que
vrtices vizinhos no recebam a mesma cor.
Teorema: G 2-colorvel se e somente se G no
contm um ciclo mpar (ciclo com nmero mpar de
arestas.

Busca em profundidade
Aplicao 5: Dado um grafo G, decidir se G 2-colorvel.
G

a'

b'

c'

d'

e'

f'

g'

h'
?

2-colorvel

no 2-colorvel

Busca em profundidade
Aplicao 5: Dado um grafo G, decidir se G 2-colorvel.

Soluo: Atribuir cor 0 raiz da busca e rodar:


procedimento P(v)
t t + 1; PE(v) t
para todo vrtice w em N(v) faa
se PE(w) = 0
ento visitar vw;
pai(w) v; cor(w) 1 cor(v);
executar P(w)
seno se PS(w) = 0 e w pai(v)
ento se cor(w) cor(v)
ento visitar vw
seno pare: ciclo mpar! (imprimir como na Aplic.4)
fim-para
t t + 1; PS(v) t

Busca em profundidade
Exerccio: Elaborar um mtodo (algoritmo) para resolver a
seguinte questo: Dado um grafo conexo G e uma rvore
geradora T de G, decidir se T uma rvore de profundidade
para G. Isto , decidir se existe uma busca em profundidade
em G que produza T como rvore de profundidade.

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
Uma articulao de um grafo conexo G um vrtice
v cuja remoo desconecta G.
Se v articulao ento (Gv) > (G), isto , o
nmero de componentes conexas de Gv maior do
que o nmero de componentes conexas de G.

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
Uma bloco de um grafo G um subgrafo maximal H
de G com a seguinte propriedade: H (considerado
isoladamente) conexo e no contm articulaes.
Em alguns casos, um bloco pode ser formado por
uma nica aresta. Esta aresta ser chamada ponte.
Em todo bloco que no seja uma ponte, existem
dois caminhos internamente disjuntos entre qualquer
par de vrtices. Neste caso, o bloco um subgrafo
maximal biconexo.

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
G
a

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
G
a

b
d

e
g

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
G
a

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
G
a

d
f

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
G
a

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
G
articulao

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
G
articulao

bloco

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
G
articulao

bloco

ponte
g

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
G
articulao
bloco

ponte
g

A remoo de uma
ponte desconecta o
grafo!

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
Os blocos de um grafo G determinam naturalmente
uma partio do conjunto de arestas de G, isto ,
cada aresta pertence a um e apenas um bloco de G.
O mesmo no ocorre em relao aos vrtices:
se v pertence a mais de um bloco ento v
uma articulao
se v pertence a um nico bloco ento v no
uma articulao

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
Considerando o grafo como uma rede
articulaes so ns crticos
pontes so conexes crticas

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.

Definio:
Seja T uma rvore de profundidade para o grafo G.
back(v) = PE do vrtice w mais prximo da raiz de T que
pode ser alcanado a partir de v usando 0 ou mais arestas
de T para baixo e, a seguir, no mximo uma aresta de
retorno.

Busca em profundidade
G

e
c

g
d
v

PE(v)

10

11

PS(v)

14

13

12

back(v)

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.

Como calcular back(v)

back(v) = min( { PE(v) } U


{ back(w) | w filho de v em T } U
{ PE(w) | vw aresta de retorno } )

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
procedimento P(v) -- com clculo de back(v)
t t + 1; PE(v) t; back(v) PE(v); => inicializao
para todo vrtice w em N(v) faa
se PE(w) = 0
ento visitar vw; pai(w) v;
executar P(w)
back(v) min( back(v), back(w) )
seno se PS(w) = 0 e w pai(v)
ento visitar vw
back(v) min( back(v), PE(w) )
fim-para
t t + 1; PS(v) t

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
Como usar os valores back(v) para determinar as
articulaes
Teorema: Seja T uma rvore de profundidade para um
grafo G. Suponha que os valores PE(v) e back(v) estejam
calculados. Seja v um vrtice qualquer de G.
Se v a raiz de T ento v articulao sss v possui
dois ou mais filhos em T.
Se v no a raiz de T ento v articulao sss existe
pelo menos um filho w de v com back(w) PE(v).

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
procedimento P(v) -- com clculo de back(v) e dos blocos (idia: usar uma pilha)
t t + 1; PE(v) t; back(v) PE(v); => inicializao
para todo vrtice w em N(v) faa
se PE(w) = 0
ento visitar vw; empilhar vw; pai(w) v
executar P(w)
se back(w) PE(v) ento desempilhar e imprimir tudo at vw
back(v) min( back(v), back(w) )
seno se PS(w) = 0 e w pai(v)
ento visitar vw; empilhar vw
back(v) min( back(v), PE(w) )
fim-para
t t + 1; PS(v) t

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
Algumas questes:
Se a busca em profundidade se iniciar por um vrtice
que no articulao, ento a raiz da rvore de
profundidade ter apenas um filho! (veja o Teorema)
Exerccio: Simular a execuo para observar o
comportamento da pilha de arestas.
Exerccio: Fazer pequenos acrscimos no cdigo para
determinar as articulaes e as pontes.

Busca em profundidade
Aplicao 6: Dado um grafo G, determinar as articulaes
e os blocos de G.
Observao:
Um filho w de v que satisfaa back(w) PE(v)
chamado de demarcador de v.
Exerccio: Verificar se cada bloco possui o seu prprio
demarcador. (Se isto for verdade, ento o nmero de
demarcadores igual ao nmero de blocos.)

Busca em profundidade p/ digrafos


Inicializao
t0

-- t o relgio ou tempo global

para todo vrtice v em V(G) faa


PE(v) 0
-- PE(v) a profundidade de entrada de v
PS (v) 0
-- PS(v) a profundidade de sada de v
pai(v) null -- ponteiros que definem a floresta de profundidade T

Chamada Externa
enquanto existe v em V(G) tal que PE(v) = 0 faa
executar P(v) -- nova raiz da busca

Busca em profundidade p/ digrafos


Procedimento recursivo de busca p/ digrafos
procedimento P(v)
t t + 1; PE(v) t
para todo vrtice w em Nout (v) faa
se PE(w) = 0 (se w ainda no foi alcanado pela busca)
marcar vw como aresta azul da floresta de profundidade T
ento
pai(w) v
executar P(w)

seno

se PS(w) = 0
(se w ainda no saiu da busca)
ento marcar vw como aresta vermelha de retorno
seno se PE(v) < PE(w) (se v entrou antes de w na busca)
ento marcar vw como aresta amarela de avano
seno marcar vw como aresta verde cruzamento

fim-para
t t + 1; PS(v) t
fim-do-procedimento

Busca em profundidade p/ digrafos


G

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

10

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

10

11

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

10

11

PS(v)

Busca em profundidade p/ digrafos


G

PE(v)

10

11

PS(v)

12

Busca em profundidade p/ digrafos


G

PE(v)

10

11

PS(v)

13

12

Busca em profundidade p/ digrafos


G

PE(v)

10

11

PS(v)

13

12

Busca em profundidade p/ digrafos


G

PE(v)

10

11

PS(v)

14

13

12

Busca em profundidade p/ digrafos


G

PE(v)

10

11

15

PS(v)

14

13

12

Busca em profundidade p/ digrafos


G

PE(v)

10

11

15

PS(v)

14

13

12

Busca em profundidade p/ digrafos


G

PE(v)

10

11

15

PS(v)

14

13

12

16

Busca em profundidade p/ digrafos


G

PE(v)

10

11

15

17

PS(v)

14

13

12

16

Busca em profundidade p/ digrafos


G

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

Busca em profundidade p/ digrafos


G

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

Busca em profundidade p/ digrafos


G

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

Busca em profundidade p/ digrafos


G

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

Busca em profundidade p/ digrafos


G

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

19

Busca em profundidade p/ digrafos


G

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

20

19

Busca em profundidade p/ digrafos


Complexidade da busca em profundidade
para digrafos:
O(n + m)

( onde n = V(G) e m = E(G) )

Busca em profundidade p/ digrafos


A floresta (direcionada) de profundidade T uma
floresta geradora de G (isto , uma floresta que
alcana todos os vrtices de G); neste caso, todos os
vrtices de G so alcanados pela busca e ficam com
uma PE diferente de zero no final da mesma.
Somente as arestas azuis (ligando pai e filho)
pertencem floresta de profundidade T. As arestas de
retorno (vermelhas), de avano (amarelas) e de
cruzamento (verdes) no pertencem a T.

Busca em profundidade p/ digrafos


Propriedades das arestas de retorno
Toda aresta de retorno fecha um ciclo direcionado.
Toda aresta de retorno liga um vrtice v a um de seus
ancestrais na floresta de profundidade T.

Busca em profundidade p/ digrafos


Intervalo de vida de um vrtice v : I(v) = [ PE(v) , PS(v) ]

t
a
b
c
d
e
f
g
h
i
j

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

20

19

10

11

12

13

14

15

16

17

18

19

20

Busca em profundidade p/ digrafos


Caracterizao das arestas da floresta de profundidade
(arestas azuis)
Seja vw aresta de G. Ento:
vw uma aresta da floresta de profundidade
se e somente se
I(v) contm I(w) e, no momento da visita, PE(w) = 0

Busca em profundidade p/ digrafos


Caracterizao das arestas de avano
(arestas amarelas)
Seja vw aresta de G. Ento:
vw uma aresta de avano
se e somente se
I(v) contm I(w) e, no momento da visita, PE(w) 0

Busca em profundidade p/ digrafos


Caracterizao das arestas de retorno
(arestas vermelhas)
Seja vw aresta de G. Ento:
vw uma aresta de retorno
se e somente se
I(v) est contido em I(w)

Busca em profundidade p/ digrafos


Caracterizao das arestas de cruzamento
(arestas verdes)
Seja vw aresta de G. Ento:
vw uma aresta de cruzamento
se e somente se
I(v) est totalmente direita de I(w)

Busca em profundidade p/ digrafos


Aplicao 1: Dado um digrafo G, determinar as
componentes fortemente conexas (cfcs) de G.
Uma componente fortemente conexa de um digrafo
G um subdigrafo H de G que maximal com
relao seguinte propriedade:
Para qualquer par de vrtices v,w de H, existe
em H um caminho direcionado de v para w e um
caminho direcionado de w para v

Busca em profundidade p/ digrafos


G

g
cfc

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

20

19

Busca em profundidade p/ digrafos


Aplicao 1: Dado um digrafo G, determinar as
componentes fortemente conexas de G.
As cfcs de um digrafo G determinam naturalmente
uma partio do conjunto de vrtices de G, isto ,
cada vrtice pertence a uma nica cfc de G.
O mesmo no ocorre em relao s arestas: algumas
arestas no pertencem a nenhuma cfc.
Se aps a busca alguma aresta no pertence a
nenhuma cfc, ento esta aresta pode ser da floresta
de profundidade, ou de avano, ou de
cruzamento.

Busca em profundidade p/ digrafos


Aplicao 1: Dado um digrafo G, determinar as
componentes fortemente conexas de G.

Definio:
Seja T uma floresta de profundidade para o digrafo G.
old(v) = PE do vrtice w mais antigo na busca que esteja
na mesma cfc de v e que possa ser alcanado a partir de v
usando 0 ou mais arestas azuis de T para baixo e, a seguir,
no mximo uma aresta de retorno ou de cruzamento.

Busca em profundidade p/ digrafos


G

g
cfc

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

20

19

old(v)

15

17

17

Busca em profundidade p/ digrafos


Aplicao 1: Dado um digrafo G, determinar as
componentes fortemente conexas de G.

Como calcular old(v)

old(v) = min(

{ PE(v) } U
{ old(w) | w filho de v em T } U
{ PE(w) | vw aresta de retorno } U
{ PE(w) | vw aresta de cruzamento
e v,w esto na mesma cfc } )

Busca em profundidade p/ digrafos


procedimento P(v) -- com clculo de old(v) e das cfcs
t t + 1; PE(v) t; old(v) PE(v); => inicializao de old(v)
empilhar v em Q
para todo vrtice w em Nout (v) faa
se PE(w) = 0
ento marcar vw como aresta da floresta de profundidade
pai(w) v; executar P(w)
executar P(w); old(v) min( old(v), old(w) )
seno se PS(w) = 0
ento marcar vw como aresta de retorno
old(v) min( old(v), PE(w) )
seno se PE(v) < PE(w)
ento marcar vw como aresta de avano
seno marcar vw como aresta de cruzamento
se w est em Q ento old(v)min(old(v), PE(w))
fim-para
t t + 1; PS(v) t
se old(v) = PE(v) ento desempilhar todos os vrtices at v (inclusive) ==> formam cfc!
fim-do-procedimento

Busca em profundidade p/ digrafos


Aplicao 1: Dado um digrafo G, determinar as
componentes fortemente conexas de G.

Vrtices fortes
Um vrtice v forte se old(v) = PE(v) no momento em
que v sai da busca (ltima linha do procedimento de
busca no slide anterior).
Ao encontrar um vrtice forte v, imediatamente
desempilhamos todos os vrtices at v. Os vrtices
desempilhados formam uma nova cfc.

Busca em profundidade p/ digrafos


G

Q=
v

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

Q={a}
v

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

Q = { a, b }
v

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

Q = { a, b, c }
v

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

Q = { a, b, c }
v

PE(v)

PS(v)

Busca em profundidade p/ digrafos


G

Q = { a, b, c }
v

PE(v)

PS(v)

old(v)

Busca em profundidade p/ digrafos


G

Q = { a, b, c }
v

PE(v)

PS(v)

old(v)

Busca em profundidade p/ digrafos


G

Q = { a, b, c }
v

PE(v)

PS(v)

old(v)

Busca em profundidade p/ digrafos


G

Q = { a, b, c, d }
v

PE(v)

PS(v)

old(v)

Busca em profundidade p/ digrafos


G

Q = { a, b, c, d }
v

PE(v)

PS(v)

old(v)

Busca em profundidade p/ digrafos


G

Q = { a, b, c, d }
v

PE(v)

PS(v)

old(v)

Busca em profundidade p/ digrafos


G

Vrtice forte!

Q = { a, b, c, d }
v

PE(v)

PS(v)

old(v)

Busca em profundidade p/ digrafos


G

Q=
v

PE(v)

PS(v)

old(v)

Busca em profundidade p/ digrafos


G

Q={e}
v

PE(v)

PS(v)

old(v)

Busca em profundidade p/ digrafos


G

Q={e}
v

PE(v)

PS(v)

old(v)

Busca em profundidade p/ digrafos


G

Q = { e, f }
v

PE(v)

10

PS(v)

old(v)

Busca em profundidade p/ digrafos


G

Q = { e, f, g }
v

PE(v)

10

11

PS(v)

old(v)

Busca em profundidade p/ digrafos


G

Q = { e, f, g }
v

PE(v)

10

11

PS(v)

old(v)

Busca em profundidade p/ digrafos


G

Q = { e, f, g }
v

PE(v)

10

11

PS(v)

12

old(v)

Busca em profundidade p/ digrafos


G

Q = { e, f, g }
v

PE(v)

10

11

PS(v)

13

12

old(v)

Busca em profundidade p/ digrafos


G

Q = { e, f, g }
v

PE(v)

10

11

PS(v)

13

12

old(v)

Busca em profundidade p/ digrafos


G

Vrtice forte!

Q = { e, f, g }
v

PE(v)

10

11

PS(v)

14

13

12

old(v)

Busca em profundidade p/ digrafos


G

Q=
v

PE(v)

10

11

PS(v)

14

13

12

old(v)

Busca em profundidade p/ digrafos


G

Q={h}
v

PE(v)

10

11

15

PS(v)

14

13

12

old(v)

Busca em profundidade p/ digrafos


G

Q={h}
v

PE(v)

10

11

15

PS(v)

14

13

12

old(v)

Busca em profundidade p/ digrafos


G

Vrtice forte!

Q={h}
v

PE(v)

10

11

15

PS(v)

14

13

12

16

old(v)

15

Busca em profundidade p/ digrafos


G

Q=
v

PE(v)

10

11

15

PS(v)

14

13

12

16

old(v)

15

Busca em profundidade p/ digrafos


G

Q={i}
v

PE(v)

10

11

15

17

PS(v)

14

13

12

16

old(v)

15

Busca em profundidade p/ digrafos


G

Q = { i, j }
v

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

old(v)

15

Busca em profundidade p/ digrafos


G

Q = { i, j }
v

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

old(v)

15

Busca em profundidade p/ digrafos


G

Q = { i, j }
v

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

old(v)

15

Busca em profundidade p/ digrafos


G

Q = { i, j }
v

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

old(v)

15

Busca em profundidade p/ digrafos


G

Q = { i, j }
v

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

19

old(v)

15

17

Busca em profundidade p/ digrafos


G

Vrtice forte!

Q = { i, j }
v

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

20

19

old(v)

15

17

17

Busca em profundidade p/ digrafos


G

Q = ==> FIM!
v

PE(v)

10

11

15

17

18

PS(v)

14

13

12

16

20

19

old(v)

15

17

17

Busca em profundidade p/ digrafos


Aplicao 1: Dado um digrafo G, determinar as
componentes fortemente conexas de G.

Observaes finais
A determinao das cfcs obviamente produz sempre
o mesmo resultado, independentemente da ordem de
visita dos vrtices/arestas escolhida para a busca!
Uma aresta vw pode desempenhar um papel em uma
busca e outro papel em outra. Exemplo: vw pode ser
aresta de cruzamento em uma busca e ser de avano
em outra, e assim por diante.

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.

Um digrafo G acclico se G no contm ciclos


direcionados.
Uma ordenao topolgica de um digrafo acclico
G uma ordenao v1 v2 v3 vn1 vn dos vrtices de
G com a seguinte propriedade:
se existe uma aresta em G de vi a vj ento i < j

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
G
(digrafo acclico)
b
c

Uma ordenao topolgica de G: i j h e f g a b d c

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
G
(digrafo acclico)
b
c

Uma ordenao topolgica de G: i j h e f g a b d c


Outra ordenao topolgica de G: e i j h a f g d b c

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.

Como decidir se um dado digrafo acclico?


Basta rodar uma busca em profundidade sobre G. Se
esta busca no produzir nenhuma aresta de retorno,
ento G acclico.

Se uma busca sobre G no produz aresta de retorno,


ento nenhuma outra busca produzir aresta de
retorno!

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
Aplicaes da ordenao topolgica
Escalonamento de atividades: cada vrtice representa
uma atividade, e cada aresta direcionada de a para b
indica que a atividade b s pode ser executada depois
da atividade a. A ordenao topolgica fornece portanto
uma sequncia vivel para a realizao das atividades.

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.

Aplicaes da ordenao topolgica


Escalonamento de tarefas em um nico processador:
cada vrtice representa uma tarefa, e cada aresta
direcionada de a para b indica que a tarefa a deve
enviar um dado para a tarefa b (a tarefa b s pode
iniciar sua execuo depois que a tarefa a enviar o
dado). Dado que existe um nico processador para
executar as tarefas, a ordenao topolgica fornece uma
sequncia de execuo das tarefas no processador.

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.

Algoritmo para ordenao topolgica de um digrafo G :


1. Rodar uma busca em profundidade sobre G. Se esta
busca produziu alguma aresta de retorno, ento pare: G
no acclico. Caso contrrio, v para o passo 2.
2. Ordene os valores das profundidades de sada geradas
pela busca em ordem decrescente.
3. Faa v1 como o vrtice de maior PS, v2 como o vrtice
de segunda maior PS, e assim por diante.
4. A ordenao v1 v2 v3 vn1 vn obtida no passo 3 uma
ordenao topolgica!

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

PS(v)

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

PS(v)

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

PS(v)

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

PS(v)

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

PS(v)

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

PS(v)

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

PS(v)

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

PS(v)

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

PS(v)

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

PS(v)

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

PS(v)

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

PS(v)

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

PS(v)

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

11

PS(v)

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

11

PS(v)

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

11

PS(v)

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

12

11

PS(v)

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

12

13

11

PS(v)

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

12

13

11

PS(v)

14

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

12

13

11

PS(v)

15

14

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

12

13

11

PS(v)

15

14

16

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

17

12

13

11

PS(v)

15

14

16

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

17

12

13

18

11

PS(v)

15

14

16

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

17

12

13

18

11

PS(v)

15

14

16

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

17

12

13

18

11

PS(v)

15

14

19

16

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

17

12

13

18

11

PS(v)

15

14

19

16

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PE(v)

17

12

13

18

11

PS(v)

20

15

14

19

16

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PS(v)

20

15

14

19

16

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

PS(v)

20

19

16

15

14

10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

Ordenao topolgica
a

v1

v2

v3

v4

v5

v6

v7

v8

v9

v10

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

Ordenao topolgica
a

Por que este algoritmo funciona corretamente?

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

Ordenao topolgica
a

Note que o vrtice com a menor PS um sumidouro


(vrtice com grau de sada igual a zero)

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

Ordenao topolgica
a

Portanto, a posio deste vrtice est correta na


ordenao topolgica, pois dele no partem arestas

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

Ordenao topolgica
a

A posio de f tambm est correta, pois


f um sumidouro no digrafo G g

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.
a

G
(digrafo acclico)

Ordenao topolgica
a

v1

v2

v3

v4

v5

v6

v7

v8

v9

v10

Aplicando sucessivamente este raciocnio, cada vrtice


vi um sumidouro no digrafo G {vi+1, vi+2, ,vn }

Busca em profundidade p/ digrafos


Aplicao 2: Dado um digrafo acclico G, obter uma
ordenao topolgica de G.

Complexidade do algoritmo para ordenao topolgica


de um digrafo G.
Rodar uma busca em profundidade sobre G tem
complexidade O(n + m).
Cada vez que um vrtice sai da busca (recebe uma PS
diferente de zero), colocado imediatamente esquerda
da ordenao topolgica sendo construda. Isto dispensa
o passo de ordenao das PSs.
Portanto, a complexidade final O(n + m).

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.

Idia: todo digrafo acclico possui um sumidouro!


(para provar este fato, basta ver que qualquer caminho
orientado de comprimento mximo em um digrafo
acclico termina necessariamente em um sumidouro)
Realizar a seguinte iterao, at que no haja mais
vrtices: localizar um sumidouro, retir-lo do digrafo
e coloc-lo esquerda na ordenao sendo
construda.
possvel implementar a idia acima em tempo
linear ? (isto , O(n + m) ?)

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
a

b
c

d
g

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
a

b
c

d
g

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
a

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
a

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
a

dc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
a

dc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
a

gdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
a

gdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
e

agdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
e

agdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
e

bagdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
e

bagdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
e

fbagdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
e

fbagdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
e

hfbagdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
e

hfbagdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
i

ehfbagdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
i

ehfbagdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
i

jehfbagdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
i

jehfbagdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.

ijehfbagdc

Busca em profundidade p/ digrafos


Exerccio: Desenvolver um algoritmo alternativo para
obter uma ordenao topolgica de um digrafo acclico G.
a

b
c

d
g

ijehfbagdc
Ordenao topolgica!

Busca em largura
Inicializao
t0
-- t o relgio ou tempo global
F -- fila auxiliar para a busca em largura
para todo vrtice v em V(G) faa
L(v) 0
-- L(v) o ndice de v na busca em largura
pai(v) null -- ponteiros que definem a floresta de largura

Para que a busca atinja todos os vrtices, no caso de G ser desconexo:


enquanto existe v em V(G) tal que L(v) = 0 faa
nivel(v) 0
-- como v uma nova raiz, seu nvel igual a 0
t t + 1; L(v) t
colocar v na fila F
realizar a busca em largura
fim-enquanto

Busca em largura
Algoritmo iterativo para a busca em largura:
enquanto F faa
v primeiro elemento de F
retirar v de F
para todo vrtice w em N(v) faa
se L(w) = 0
ento visitar aresta vw
--aresta pai da floresta de largura T
pai(w) v
--v o pai de w na floresta de largura T
nvel(w) nvel(v)+1; t t + 1; L(w) t
colocar w no final da fila F
seno se nvel(w) = nvel(v)
ento se pai(w) = pai(v)
visitar a aresta
ento vw aresta irmo
somente se w
seno vw aresta primo
ainda est em F
seno se nvel(w) = nvel(v)+1
ento vw aresta tio
fim-para
fim-enquanto

Busca em largura
a

F=

h
g

L(v)

Busca em largura
a

F=a

h
g

L(v)

Busca em largura
a

F=a

h
g

L(v)

Busca em largura
a

F=ab

h
g

L(v)

Busca em largura
a

F=abc

h
g

L(v)

Busca em largura
a

F=abc

h
g

L(v)

Busca em largura
a

F=abcd

h
g

L(v)

Busca em largura
a

F=abcd

h
g

L(v)

Busca em largura
a

F=abcd

h
g

L(v)

Busca em largura
a

F=abcd

h
g

L(v)

Busca em largura
a

F=abcde

h
g

L(v)

Busca em largura
a

F=abcde

h
g

L(v)

Busca em largura
a

F=abcdef

h
g

L(v)

Busca em largura
a

F=abcdefg

h
g

L(v)

Busca em largura
a

F=abcdefg

h
g

L(v)

Busca em largura
a

F=abcdefg

h
g

L(v)

Busca em largura
a

F=abcdefg

h
g

L(v)

Busca em largura
a

F=abcdefgh

h
g

L(v)

Busca em largura
a

F=abcdefgh

h
g

L(v)

Busca em largura
a

F=abcdefgh

h
g

L(v)

Busca em largura
a

F=abcdefgh

h
g

L(v)

Busca em largura
a

F=abcdefgh

h
g

L(v)

Busca em largura
a

F=abcdefgh

h
g

L(v)

Busca em largura
Esgotar o pai antes de processar os filhos

A prxima aresta a ser visitada parte sempre do


vrtice mais antigo na busca

Busca em largura
Complexidade da busca em largura:

O(n + m)
( onde n = V(G) e m = E(G) )

Busca em largura
A floresta de largura T uma floresta geradora de G
(isto , uma floresta que alcana todos os vrtices de
G); neste caso, todos os vrtices de G so alcanados
pela busca e ficam com um valor L(v) diferente de zero
no final da mesma.
Somente as arestas-pai (azuis) (ligando pai e filho)
pertencem floresta de profundidade T. As arestasirmo (vermelhas), primo (amarelas) e tio (verdes)
no pertencem a T.

Busca em largura
Caracterizao das arestas-pai (arestas azuis)
Seja vw aresta de G. Ento:
vw uma aresta-pai (da floresta de largura)
se e somente se
nvel(w) = nvel(v) +1 e, no momento da visita, L(w) = 0

Busca em largura
Caracterizao das arestas-tio (arestas verdes)
Seja vw aresta de G. Ento:
vw uma aresta-tio
se e somente se
nvel(w) = nvel(v) +1 e, no momento da visita, L(w) 0

Busca em largura
Caracterizao das arestas-irmo (arestas vermelhas)
Seja vw aresta de G. Ento:
vw uma aresta-irmo
se e somente se
nvel(w) = nvel(v) e pai(w) = pai(v)

Busca em largura
Caracterizao das arestas-primo (arestas amarelas)
Seja vw aresta de G. Ento:
vw uma aresta-primo
se e somente se
nvel(w) = nvel(v) e pai(w) pai(v)

Busca em largura
Propriedade fundamental da busca em largura
Seja vw uma aresta de um grafo G, e seja T uma floresta de
largura de G. Ento:
| nvel(v) nvel(w) | 1.

A demonstrao dessa propriedade se reduz ao caso em


que vw uma aresta-tio em relao a T.
Os vrtices que se encontram em F em qualquer
momento da busca diferem em no mximo um nvel!

Busca em largura
Aplicao 1: Dado um grafo conexo G e um vrtice x de
G, determinar as distncias de x a todos os demais vrtices.
Soluo:
Aplicar uma busca em largura em G com raiz x,
obtendo uma rvore de largura T
Ao final da busca, dist(x, v) = nvel(v), para todo v
Um caminho mnimo de x a v dado pelo caminho de x
a v na rvore T.

Busca em largura
Aplicao 2: Dado um labirinto representado por uma
matriz, determinar o menor caminho da entrada at a sada
do labirinto (se existir).
Soluo:
Modelar a matriz como um grafo, onde a entrada e a
sada so representadas por vrtices x e y.
Realizar uma busca em largura em G com uma nica
raiz x, obtendo uma rvore de largura T.
Ao final da busca, se L(y) 0 ento y pode ser
alcanado a partir de x.
O caminho de x a y em T a soluo, e dist(x, y) =
nvel(y).

Busca em largura
Aplicao 3: Dado um grafo G, determinar se G
bipartido.
Soluo:
Aplicar uma busca em largura em G uma raiz qualquer,
obtendo uma floresta de largura T.
Ao final da busca, G bipartido se e somente se T no
contm arestas-irmo nem arestas-primo.
Note que arestas-irmo e arestas-primo fecham ciclos
mpares!
Para definir uma 2-colorao de G: os vrtices em
nveis pares recebem uma cor, e os vrtices em nveis
mpares outra cor.

Busca em largura
Exerccio: Elaborar um mtodo (algoritmo) para resolver a
seguinte questo: Dado um grafo conexo G e uma rvore
geradora T de G, decidir se T uma rvore de largura para
G. Isto , decidir se existe uma busca em largura em G que
produza T como rvore de largura.

Busca em largura
Exerccio: Elaborar uma adaptao da busca em largura,
para aplic-la a digrafos.

Busca em largura
Exerccio: Mostre que o algoritmo a seguir funciona como
uma busca em profundidade se a estrutura de dados D for
uma pilha, e como uma busca em largura se a estrutura de
dados D for uma fila.
desmarcar todos os vrtices
escolher uma raiz v; pai(v) null; marcar v; inserir v em D
enquanto D faa
seja v o primeiro elemento de D
se existe w em N(v) que esteja desmarcado
ento visitar aresta vw
pai(w) v
marcar w
inserir w em D
seno remover v de D
fim-enquanto

Algoritmo de Dijkstra
Problema: Dado um digrafo G com pesos positivos nas
arestas, determinar caminhos mnimos de um vrtice v a
todos os demais vrtices do digrafo.
matriz de pesos W
a

1
2

1 3

3
1
d

c
3

1
2

0, se x = y
W(x, y) = peso da aresta xy, se houver (x y)
, se no houver aresta xy (x y)

Algoritmo de Dijkstra
Realizando uma adaptao no algoritmo do exerccio
anterior, e fazendo com que a estrutura de dados D seja
uma fila de prioridades (heap), obtemos o Algoritmo de
Dijkstra.
desmarcar todos os vrtices; escolher uma raiz v; L(v) 0; pai(v) null; inserir v em D
para todo w em V(G)\{v} faa L(w) e pai(w) null
enquanto D faa
seja v o primeiro elemento de D
-- v elemento de menor valor L(v)
remover v de D; marcar v
para todo vrtice w em Nout(v) que esteja desmarcado faa
se w no pertence a D ento inserir w em D com prioridade L(w)
se L(v) + W(v, w) < L(w)
ento L(w) L(v) + W(v, w)
reposicionar w em D (de acordo com sua nova prioridade)
pai(w) v
fim-para
fim-enquanto

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

null

null

null

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

null

null

null

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

null

null

null

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

null

null

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

null

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

Algoritmo de Dijkstra
raiz: a
a

6
1
2

1 3

3
1
d

1
2

L(v)

pai(v)

null

FIM!

Algoritmo de Dijkstra
Questo: Como determinar os caminhos mnimos?
Soluo: Observe que os ponteiros pai(w) determinam
naturalmente uma rvore T, chamada de rvore de
caminhos mnimos (a partir da raiz escolhida). Na
simulao, esta rvore T est formada pelas arestas azuis.
Para determinar um caminho mnimo da raiz v at um
vrtice w, basta tomar o caminho de v a w em T. O custo
deste caminho precisamente L(w).

Algoritmo de Dijkstra
Questo: Como achar os caminhos mnimos da raiz a
todos os demais vrtices em um grafo G no direcionado?
Soluo: Basta transformar G em um digrafo H da seguinte
forma: fazer V(H) = V(G) e, para cada aresta no
direcionada xy com peso p em G, criar em H duas arestas
direcionadas xy e yx, ambas com peso p. Por outro lado, se
no existe aresta xy em G, criar em H duas arestas
direcionadas xy e yx com peso . Basta ento aplicar o
algoritmo de Dijkstra a H.

Algoritmo de Dijkstra
Exerccio: Mostre que o Algoritmo de Dijkstra se
comporta como uma busca em largura se os pesos de todas
as arestas so iguais a um. Neste caso, a rvore de
caminhos mnimos uma rvore de largura, e cada rtulo
L(w) igual distncia (em arestas) da raiz at w.

Algoritmo de Floyd-Warshall
Problema: Dado um digrafo G com pesos positivos nas
arestas, determinar caminhos mnimos entre todos os pares
ordenados (v, w) de vrtices do digrafo.
A entrada para este problema a mesma do anterior.
matriz de pesos W
1

1
2

1 3

3
1
4

3
3

1
2

0, se i = j
W(i, j) = peso da aresta ij, se houver (i j)
, se no houver aresta ij (i j)

Algoritmo de Floyd-Warshall
Problema: Dado um digrafo G com pesos positivos nas
arestas, determinar caminhos mnimos entre todos os pares
ordenados (v, w) de vrtices do digrafo.
A entrada para este problema a mesma do anterior.
Matriz-soluo: custos de todos os caminhos mnimos
1

1
2

1 3

3
1
4

3
3

1
2

Algoritmo de Floyd-Warshall
Ideia do algoritmo: Calcular os valores Dk(i, j)
Dk(i, j) = custo do caminho mnimo de i a j podendo usar
como vrtices intermedirios os vrtices do conjunto
{1, 2,, k} \ {i, j}.
Observe que:
D0(i, j) = W(i, j)
(valor na posio (i, j) da matriz de pesos W )
Dn(i, j) = custo do caminho mnimo de i a j
(valor na posio (i, j) da matriz-soluo)

Algoritmo de Floyd-Warshall
Ideia do algoritmo: Calcular os valores Dk(i, j)
Definindo as matrizes do algoritmo:
Para cada k = 0, 1, 2, , n, defina Dk como a matriz
contendo todos os valores Dk(i, j)
Observe que:
D0 = W (matriz de pesos da entrada)
Dn = matriz-soluo

Algoritmo de Floyd-Warshall
Ideia do algoritmo: Calcular os valores Dk(i, j)
Esboo do algoritmo:
inicializar D0 W
para cada k = 1, 2, , n faa
calcular a matriz Dk

Algoritmo de Floyd-Warshall
Ideia do algoritmo: Calcular os valores Dk(i, j)
Esboo do algoritmo:
inicializar D0 W
para cada k = 1, 2, , n faa
calcular a matriz Dk
Clculo da matriz Dk :
para cada i = 1, 2, , n faa
para cada j = 1, 2, , n faa
calcular Dk(i, j)

Algoritmo de Floyd-Warshall
Ideia do algoritmo: Calcular os valores Dk(i, j)
Esboo do algoritmo:
inicializar D0 W
para cada k = 1, 2, , n faa
para cada i = 1, 2, , n faa
para cada j = 1, 2, , n faa
calcular Dk(i, j)

Algoritmo de Floyd-Warshall
Ideia do algoritmo: Calcular os valores Dk(i, j)
Frmula para calcular Dk(i, j):
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

Algoritmo de Floyd-Warshall
Ideia do algoritmo: Calcular os valores Dk(i, j)
Frmula para calcular Dk(i, j):
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

custo do caminho mnimo de i a j


sem considerar k
como vrtice intermedirio
(valor da iterao anterior)

Algoritmo de Floyd-Warshall
Ideia do algoritmo: Calcular os valores Dk(i, j)
Frmula para calcular Dk(i, j):
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

custo do caminho mnimo de i a j


sem considerar k
como vrtice intermedirio
(valor da iterao anterior)

custo do caminho mnimo de i a j


considerando k
como vrtice intermedirio
(nova possibilidade)

Algoritmo de Floyd-Warshall
Ideia do algoritmo: Calcular os valores Dk(i, j)
Frmula para calcular Dk(i, j):
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

custo do caminho mnimo de i a j


sem considerar k
como vrtice intermedirio
(valor da iterao anterior)

custo do caminho mnimo de i a j


considerando k
como vrtice intermedirio
(nova possibilidade)

i
Dk-1(i, k)

Dk-1(k, j)

Algoritmo de Floyd-Warshall
Ideia do algoritmo: Calcular os valores Dk(i, j)
Esboo do algoritmo:
inicializar D0 W
para cada k = 1, 2, , n faa
para cada i = 1, 2, , n faa
para cada j = 1, 2, , n faa
calcular Dk(i, j)

Algoritmo de Floyd-Warshall
Ideia do algoritmo: Calcular os valores Dk(i, j)
Esboo do algoritmo:
inicializar D0 W
para cada k = 1, 2, , n faa
para cada i = 1, 2, , n faa
para cada j = 1, 2, , n faa
Dk(i, j) min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

Algoritmo de Floyd-Warshall
Ideia do algoritmo: Calcular os valores Dk(i, j)
Esboo do algoritmo:
inicializar D0 W
para cada k = 1, 2, , n faa
para cada i = 1, 2, , n faa
para cada j = 1, 2, , n faa
Dk(i, j) min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

Note que Dk calculada


apenas a partir de Dk-1 !

Algoritmo de Floyd-Warshall
Ideia do algoritmo: Calcular os valores Dk(i, j)
Esboo do algoritmo:
inicializar D0 W
para cada k = 1, 2, , n faa

O(n3)

para cada i = 1, 2, , n faa


para cada j = 1, 2, , n faa
Dk(i, j) min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

1
3

2
3
4
5

D0

D1
1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(1, 1) = min { D0(1, 1) , D0(1, 1) + D0(1, 1) }

3
4

D0

D1
2

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(1, 2) = min { D0(1, 2) , D0(1, 1) + D0(1, 2) }

3
4

D0

D1
3

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(1, 3) = min { D0(1, 3) , D0(1, 1) + D0(1, 3) }

3
4

D0

D1
4

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(1, 4) = min { D0(1, 4) , D0(1, 1) + D0(1, 4) }

3
4

D0

D1
5

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(1, 5) = min { D0(1, 5) , D0(1, 1) + D0(1, 5) }

3
4

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(2, 1) = min { D0(2, 1) , D0(2, 1) + D0(1, 1) }

3
4

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(2, 2) = min { D0(2, 2) , D0(2, 1) + D0(1, 2) }

3
4

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(2, 3) = min { D0(2, 3) , D0(2, 1) + D0(1, 3) }

3
4

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(2, 4) = min { D0(2, 4) , D0(2, 1) + D0(1, 4) }

3
4

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(2, 5) = min { D0(2, 5) , D0(2, 1) + D0(1, 5) }

3
4

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(3, 1) = min { D0(3, 1) , D0(3, 1) + D0(1, 1) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(3, 2) = min { D0(3, 2) , D0(3, 1) + D0(1, 2) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(3, 3) = min { D0(3, 3) , D0(3, 1) + D0(1, 3) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(3, 4) = min { D0(3, 4) , D0(3, 1) + D0(1, 4) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(3, 5) = min { D0(3, 5) , D0(3, 1) + D0(1, 5) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(4, 1) = min { D0(4, 1) , D0(4, 1) + D0(1, 1) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(4, 2) = min { D0(4, 2) , D0(4, 1) + D0(1, 2) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(4, 3) = min { D0(4, 3) , D0(4, 1) + D0(1, 3) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(4, 4) = min { D0(4, 4) , D0(4, 1) + D0(1, 4) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(4, 5) = min { D0(4, 5) , D0(4, 1) + D0(1, 5) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(5, 1) = min { D0(5, 1) , D0(5, 1) + D0(1, 1) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(5, 2) = min { D0(5, 2) , D0(5, 1) + D0(1, 2) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(5, 3) = min { D0(5, 3) , D0(5, 1) + D0(1, 3) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(5, 4) = min { D0(5, 4) , D0(5, 1) + D0(1, 4) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1(5, 5) = min { D0(5, 5) , D0(5, 1) + D0(1, 5) }

D0

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D0

3
valores que melhoraram
considerando 1
como vrtice intermedirio

D1

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D1

3
valores que melhoraram
considerando 1 e 2
como vrtices intermedirios

D2

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D2

3
valores que melhoraram
considerando 1, 2, 3
como vrtices intermedirios

D3

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D3

3
valores que melhoraram
considerando 1, 2, 3, 4
como vrtices intermedirios

D4

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D4

3
nenhum valor melhorou
considerando 1, 2, 3, 4, 5
como vrtices intermedirios

D5

Algoritmo de Floyd-Warshall
Simulao: visualizar o clculo de Dk a partir de Dk-1
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }

1
2

1 3

3
1
4

1
2

D4

3
MATRIZ FINAL DE
CUSTOS DOS
CAMINHOS MNIMOS

D5

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Soluo: Determinar os valores Pk(i, j)
Pk(i, j) = penltimo vrtice do caminho mnimo de i a j
cujos vrtices intermedirios esto no conjunto
{1, 2,, k} \ {i, j}.
Observe que:

i,

se existe aresta direcionada de i para j

P0(i, j) =
null , caso contrrio

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Definindo as matrizes do auxiliares do algoritmo:
Para cada k = 0, 1, 2, , n, defina Pk como a matriz
contendo todos os valores Pk(i, j)
1

1
2

1 3

3
1
4

3
3

1
2

null

null

null

null

null

null

null

null

null

null

null

null

null

null

P0

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Como calcular Pk(i, j) ?
Sabemos que:
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }
Se Dk-1(i, j) < Dk-1(i, k) + Dk-1(k, j)
ento Pk(i, j) = Pk-1(i, j) ( mesmo vrtice da iterao anterior)
seno Pk(i, j) = Pk-1(k, j) ( nova possibilidade de caminho)

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Como calcular Pk(i, j) ?
Sabemos que:
Dk(i, j) = min { Dk-1(i, j) , Dk-1(i, k) + Dk-1(k, j) }
Se Dk-1(i, j) < Dk-1(i, k) + Dk-1(k, j)
ento Pk(i, j) = Pk-1(i, j)
seno Pk(i, j) = Pk-1(k, j)
Pk-1(k, j)

i
k

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Novo algoritmo:
inicializar D0 e P0
para cada k = 1, 2, , n faa
para cada i = 1, 2, , n faa
para cada j = 1, 2, , n faa
se Dk-1(i, j) < Dk-1(i, k) + Dk-1(k, j)
ento Dk(i, j) = Dk-1(i, j) e Pk(i, j) = Pk-1(i, j)
seno Dk(i, j) = Dk-1(i, k) + Dk-1(k, j) e
Pk(i, j) = Pk-1(k, j)

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )

1
2

1 3

3
1
4

1
2

3
MATRIZES FINAIS

D5

P5
1

null

null

null

null

null

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Exemplo: calcular o caminho mnimo de 5 a 3
1

1
2

1 3

3
1
4

3
3

1
2

P5
1

null

null

null

null

null

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Exemplo: calcular o caminho mnimo de 5 a 3
1

5
6

1
2

1 3

3
1
4

3
3

1
2

P5
1

null

null

null

null

null

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Exemplo: calcular o caminho mnimo de 5 a 3
1

5
6

1
2

1 3

3
1
4

3
3

P5(5, 3) = 2
1
2

P5
1

null

null

null

null

null

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Exemplo: calcular o caminho mnimo de 5 a 3
1

5
6

1
2

1
4

1 3

3
3

1
2

P5
1

null

null

null

null

null

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Exemplo: calcular o caminho mnimo de 5 a 3
1

5
6

1
2

1 3

3
1
4

3
3

P5(5, 2) = 1
1
2

P5
1

null

null

null

null

null

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Exemplo: calcular o caminho mnimo de 5 a 3
1

5
6

1
2

1
4

1 3

3
3

1
2

P5
1

null

null

null

null

null

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Exemplo: calcular o caminho mnimo de 5 a 3
1

5
6

1
2

1 3

3
1
4

3
3

P5(5, 1) = 4
1
2

P5
1

null

null

null

null

null

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Exemplo: calcular o caminho mnimo de 5 a 3
1

5
6

1
2

1
4

1 3

3
3

1
2

P5
1

null

null

null

null

null

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Exemplo: calcular o caminho mnimo de 5 a 3
1

5
6

1
2

1 3

3
1
4

3
3

P5(5, 4) = 5
1
2

P5
1

null

null

null

null

null

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Exemplo: calcular o caminho mnimo de 5 a 3
1

5
6

1
2

1
4

1 3

3
3

1
2

P5
1

null

null

null

null

null

Algoritmo de Floyd-Warshall
Questo: Como determinar os caminhos mnimos? (e no
s seus custos )
Exemplo: calcular o caminho mnimo de 5 a 3
1

5
6

1
2

1 3

3
1
4

3
3

FIM!
1
2

P5
1

null

null

null

null

null

Algoritmo de Kruskal
Problema: Dado um grafo conexo G com pesos positivos
nas arestas, determinar uma rvore geradora de G com
custo mnimo.

Algoritmo de Kruskal
O Algoritmo de Kruskal utiliza uma tcnica de
programao conhecida como Mtodo Guloso, cuja
estratgia geral : a cada nova iterao, acrescente
soluo parcial a parte mais apetitosa.
Algoritmo de Kruskal
Dado o grafo G, o algoritmo constri uma rvore geradora T de G com custo mnimo
V(T) V(G); E(T) ; -- inicializao de T
seja e1, e2, ,em uma ordenao das arestas de G onde peso(ej) peso(ej+1), j = 1,, m1
para j = 1,, m faa
se ej no forma ciclo com as arestas em E(T)
ento acrescente ej a E(T)
fim-se
fim-para
retorne T

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Exemplo: Simulao da execuo do algoritmo.
custo final da rvore geradora: 37
7

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Questo: Como saber de modo eficiente se a aresta em
considerao forma ciclo com as azuis j escolhidas?
7

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Estratgia: Uma nova aresta pode ser incorporada
soluo (floresta) parcial se ela une duas rvores distintas!
7

8
4

2
14

11
4
8

10

Algoritmo de Kruskal
Incio: Os n vrtices formam n rvores triviais distintas
(cada uma com sua cor). Nenhuma aresta foi escolhida.
8

2
4

4
9

2
14

11

4
7

10
7

6
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

2
4

4
9

2
14

11

4
7

10
7

6
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

2
4

4
9

2
14

11

4
7

10
7

6
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

2
4

4
9

2
14

11

4
7

10
6

6
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

2
4

4
9

2
14

11

4
7

10
6

6
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

2
4

4
9

2
14

11

4
7

10
3

3
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

1
4

4
9

2
14

11

4
7

10
3

3
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

1
4

4
9

2
14

11

4
7

10
3

3
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

1
4

4
9

2
14

11

4
7

10
3

3
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

1
4

3
9

2
14

11

4
7

10
3

3
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

1
4

1
9

2
14

11

4
7

10
1

1
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

1
4

1
9

2
14

11

4
7

10
1

1
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

1
4

1
9

2
14

11

4
7

10
1

1
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

1
4

1
9

2
14

11

4
7

10
1

1
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

1
4

1
9

2
14

11

4
7

10
1

1
2

Algoritmo de Kruskal
Evoluo do algoritmo: medida que as arestas so
escolhidas, realizamos a fuso das rvores.
8

1
4

1
9

2
14

11

4
7

10
1

1
2

Algoritmo de Kruskal
Como implementar a verificao de ciclos?
Algoritmo de Kruskal nova verso
Entrada: grafo G com V(G) = {1,2,, n}
Sada: rvore geradora T de G com custo mnimo
V(T) V(G); E(T) ; -- inicializao de T
para j = 1,, n faa
Sj { j}; -- inicializao dos n conjuntos disjuntos de vrtices das n rvores triviais
seja e1, e2, ,em uma ordenao das arestas de G onde peso(ej) peso(ej+1), j = 1,, m1
para j = 1,, m faa
sejam Sp e Sq os conjuntos associados aos extremos da aresta ej (onde p q)
se p q ento
acrescente ej a E(T)
Sp Sp U Sq
fim-se
fim-para
retorne T

Algoritmo de Kruskal
Clculo da Complexidade
Algoritmo de Kruskal nova verso
Entrada: grafo G com V(G) = {1,2,, n}
Sada: rvore geradora T de G com custo mnimo
V(T) V(G); E(T) ; -- inicializao de T
para j = 1,, n faa
Sj { j}; -- inicializao dos n conjuntos disjuntos de vrtices das n rvores triviais
seja e1, e2, ,em uma ordenao das arestas de G onde peso(ej) peso(ej+1), j = 1,, m1
para j = 1,, m faa
sejam Sp e Sq os conjuntos associados aos extremos da aresta ej (onde p q)
se p q ento
acrescente ej a E(T)
Sp Sp U Sq
fim-se
fim-para
retorne T

Algoritmo de Kruskal
Clculo da Complexidade
Algoritmo de Kruskal nova verso
Entrada: grafo G com V(G) = {1,2,, n}
Sada: rvore geradora T de G com custo mnimo
V(T) V(G); E(T) ; O(n)
para j = 1,, n faa
Sj { j}; -- inicializao dos n conjuntos disjuntos de vrtices das n rvores triviais
seja e1, e2, ,em uma ordenao das arestas de G onde peso(ej) peso(ej+1), j = 1,, m1
para j = 1,, m faa
sejam Sp e Sq os conjuntos associados aos extremos da aresta ej (onde p q)
se p q ento
acrescente ej a E(T)
Sp Sp U Sq
fim-se
fim-para
retorne T

Algoritmo de Kruskal
Clculo da Complexidade
Algoritmo de Kruskal nova verso
Entrada: grafo G com V(G) = {1,2,, n}
Sada: rvore geradora T de G com custo mnimo
V(T) V(G); E(T) ; O(n)
para j = 1,, n faa
O(n)
Sj { j};
seja e1, e2, ,em uma ordenao das arestas de G onde peso(ej) peso(ej+1), j = 1,, m1
para j = 1,, m faa
sejam Sp e Sq os conjuntos associados aos extremos da aresta ej (onde p q)
se p q ento
acrescente ej a E(T)
Sp Sp U Sq
fim-se
fim-para
retorne T

Algoritmo de Kruskal
Clculo da Complexidade
Algoritmo de Kruskal nova verso
Entrada: grafo G com V(G) = {1,2,, n}
Sada: rvore geradora T de G com custo mnimo
V(T) V(G); E(T) ; O(n)
para j = 1,, n faa
O(n)
Sj { j};
seja e1, e2, ,em uma ordenao das arestas de G onde peso(ej) peso(ej+1) O(m log m)
para j = 1,, m faa
sejam Sp e Sq os conjuntos associados aos extremos da aresta ej (onde p q)
se p q ento
acrescente ej a E(T)
Sp Sp U Sq
fim-se
fim-para
retorne T

Algoritmo de Kruskal
Clculo da Complexidade
Algoritmo de Kruskal nova verso
Entrada: grafo G com V(G) = {1,2,, n}
Sada: rvore geradora T de G com custo mnimo
V(T) V(G); E(T) ; O(n)
para j = 1,, n faa
O(n)
Sj { j};
seja e1, e2, ,em uma ordenao das arestas de G onde peso(ej) peso(ej+1) O(m log m)
para j = 1,, m faa
sejam Sp e Sq os conjuntos associados aos extremos da aresta ej (onde p q)
se p q ento
acrescente ej a E(T) O(1)
Sp Sp U Sq
fim-se
fim-para
retorne T

Algoritmo de Kruskal
Clculo da Complexidade
Algoritmo de Kruskal nova verso
Entrada: grafo G com V(G) = {1,2,, n}
Sada: rvore geradora T de G com custo mnimo
V(T) V(G); E(T) ; O(n)
para j = 1,, n faa
O(n)
Sj { j};
seja e1, e2, ,em uma ordenao das arestas de G onde peso(ej) peso(ej+1) O(m log m)
para j = 1,, m faa
sejam Sp e Sq os conjuntos associados aos extremos da aresta ej (onde p q)
se p q ento
acrescente ej a E(T) O(1)
Total do para: O(m + n log n)
Sp Sp U Sq
fim-se
fim-para
retorne T

Algoritmo de Kruskal
Clculo da Complexidade
Algoritmo de Kruskal nova verso
Entrada: grafo G com V(G) = {1,2,, n}
Sada: rvore geradora T de G com custo mnimo
V(T) V(G); E(T) ; O(n)
para j = 1,, n faa
O(n)
Sj { j};
seja e1, e2, ,em uma ordenao das arestas de G onde peso(ej) peso(ej+1) O(m log m)
para j = 1,, m faa
sejam Sp e Sq os conjuntos associados aos extremos da aresta ej (onde p q)
se p q ento
acrescente ej a E(T) O(1)
Total do para: O(m + n log n)
Sp Sp U Sq
fim-se
fim-para
Total do algoritmo: O(m log m) = O(m log n)
retorne T

Algoritmo de Prim
O Algoritmo de Prim tambm utiliza o mtodo guloso, mas
tem um princpio de funcionamento diferente:

no algoritmo de Kruskal, a soluo parcial uma floresta;


j no algoritmo de Prim, uma rvore (grafo conexo).

Algoritmo de Prim
Dado o grafo G, o algoritmo constri uma rvore geradora T de G com custo mnimo
escolher um vrtice qualquer v em V(G); -- vrtice escolhido para ser a raiz de T
V(T) {v}; E(T) ; -- inicializao de T
para j = 1,, n 1 faa
seja e = xy a aresta de peso mnimo com um extremo x em V(T) e outro y em V(G)\ V(T)
acrescente e a E(T)
acrescente y a V(T)
fim-para
retorne T

Algoritmo de Prim
Exemplo: Simulao da execuo do algoritmo.

8
4

11

2
14

4
7

10

Algoritmo de Prim
Exemplo: Simulao da execuo do algoritmo.

8
4

2
11

raiz

14

4
7

10

Algoritmo de Prim
Exemplo: Simulao da execuo do algoritmo.

8
4

2
11

raiz

14

4
7

10

Algoritmo de Prim
Exemplo: Simulao da execuo do algoritmo.

8
4

2
11

raiz

14

4
7

10

Algoritmo de Prim
Exemplo: Simulao da execuo do algoritmo.

8
4

2
11

raiz

14

4
7

10

Algoritmo de Prim
Exemplo: Simulao da execuo do algoritmo.

8
4

2
11

raiz

14

4
7

10

Algoritmo de Prim
Exemplo: Simulao da execuo do algoritmo.

8
4

2
11

raiz

14

4
7

10

Algoritmo de Prim
Exemplo: Simulao da execuo do algoritmo.

8
4

2
11

raiz

14

4
7

10

Algoritmo de Prim
Exemplo: Simulao da execuo do algoritmo.

8
4

2
11

raiz

14

4
7

10

Algoritmo de Prim
Exemplo: Simulao da execuo do algoritmo.

8
4

2
11

raiz

14

4
7

10

Algoritmo de Prim
Exemplo: Simulao da execuo do algoritmo.
FINAL: custo da rvore geradora 37
7

8
4

2
11

raiz

14

4
7

10

Emparelhamentos
Problema 1: Para cada operrio de uma fbrica existe uma
lista das mquinas que ele est habilitado a operar.
Encontre uma alocao que maximize o nmero de pares
da forma operrio i opera a mquina j.

Emparelhamentos
Problema 1: Para cada operrio de uma fbrica existe uma
lista das mquinas que ele est habilitado a operar.
Encontre uma alocao que maximize o nmero de pares
da forma operrio i opera a mquina j.

Emparelhamentos
Problema 1: Para cada operrio de uma fbrica existe uma
lista das mquinas que ele est habilitado a operar.
Encontre uma alocao que maximize o nmero de pares
da forma operrio i opera a mquina j.

Emparelhamentos
Problema 2: Deseja-se estabelecer um pareamento de
processadores em uma rede. Encontre o maior nmero de
pares de processadores parceiros.

Emparelhamentos
Problema 2: Deseja-se estabelecer um pareamento de
processadores em uma rede. Encontre o maior nmero de
pares de processadores parceiros.

Emparelhamentos
Definio: Um emparelhamento em um grafo G um
conjunto de arestas que no tm extremos em comum.

Emparelhamentos
Definio: Um emparelhamento em um grafo G um
conjunto de arestas que no tm extremos em comum.

Emparelhamentos
Definio: Um emparelhamento em um grafo G mximo
se possui o maior nmero possvel de arestas. (Obs: pode
haver um nmero exponencial de emparelhamentos mximos!)

Emparelhamentos
Definio: Um emparelhamento em um grafo G mximo
se possui o maior nmero possvel de arestas. (Obs: pode
haver um nmero exponencial de emparelhamentos mximos!)

Emparelhamentos
Definio: Um emparelhamento em um grafo G mximo
se possui o maior nmero possvel de arestas. (Obs: pode
haver um nmero exponencial de emparelhamentos mximos!)

Emparelhamentos
Definio: Um emparelhamento em um grafo G mximo
se possui o maior nmero possvel de arestas. (Obs: pode
haver um nmero exponencial de emparelhamentos mximos!)

Emparelhamentos
Definio: Um emparelhamento em um grafo G
maximal se no est contido em nenhum emparelhamento
maior. (Obs: todo emparelhamento mximo maximal.)

Emparelhamentos
Definio: Um emparelhamento em um grafo G
maximal se no est contido em nenhum emparelhamento
maior. (Obs: todo emparelhamento mximo maximal.)

exemplo de emparelhamento maximal mas no mximo

Emparelhamentos
Definio: Seja M um emparelhamento em um grafo G.
Um vrtice v M-saturado se alguma aresta de M incide
sobre v ; caso contrrio, v M-insaturado.

Emparelhamentos
Definio: Seja M um emparelhamento em um grafo G.
Um vrtice v M-saturado se alguma aresta de M incide
sobre v ; caso contrrio, v M-insaturado.

Emparelhamentos
Definio: Seja M um emparelhamento em um grafo G.
Um vrtice v M-saturado se alguma aresta de M incide
sobre v ; caso contrrio, v M-insaturado.

vrtices saturados em vermelho

Emparelhamentos
Definio: Seja M um emparelhamento em um grafo G.
Um vrtice v M-saturado se alguma aresta de M incide
sobre v; caso contrrio, v M-insaturado.

vrtices saturados em vermelho vrtices insaturados em azul

Emparelhamentos
Definio: Um emparelhamento M em um grafo G
chamado perfeito se todo vrtice de G M-saturado. (Obs:
todo emparelhamento perfeito mximo.)

Emparelhamentos
Definio: Um emparelhamento M em um grafo G
chamado perfeito se todo vrtice de G M-saturado. (Obs:
todo emparelhamento perfeito mximo.)

vrtices saturados em vermelho no h vrtices insaturados!

Emparelhamentos
Def.: Seja M um emparelhamento. Um caminho Maumentante aquele que inicia e termina em vrtices Minsaturados, e alterna arestas de M com arestas de E(G)\M.

Emparelhamentos
Def.: Seja M um emparelhamento. Um caminho Maumentante aquele que inicia e termina em vrtices Minsaturados, e alterna arestas de M com arestas de E(G)\M.

vrtices saturados em vermelho vrtices insaturados em azul

Emparelhamentos
Def.: Seja M um emparelhamento. Um caminho Maumentante aquele que inicia e termina em vrtices Minsaturados, e alterna arestas de M com arestas de E(G)\M.

caminho M-aumentante

Emparelhamentos
Importante! Um caminho M-aumentante P fornece um
modo de aumentar o tamanho do emparelhamento M em
uma unidade.

Emparelhamentos
Importante! Um caminho M-aumentante P fornece um
modo de aumentar o tamanho do emparelhamento M em
uma unidade.

emparelhamento M

Emparelhamentos
Importante! Um caminho M-aumentante P fornece um
modo de aumentar o tamanho do emparelhamento M em
uma unidade.

caminho M-aumentante P

Emparelhamentos
Importante! Um caminho M-aumentante P fornece um
modo de aumentar o tamanho do emparelhamento M em
uma unidade.

em P, trocar arestas de M por arestas de E(G)\M, e vice-versa

Emparelhamentos
Importante! Um caminho M-aumentante P fornece um
modo de aumentar o tamanho do emparelhamento M em
uma unidade.

novo emparelhamento M

Emparelhamentos
A operao de aumento do emparelhamento dada por
M M E(P)
onde a diferena simtrica entre conjuntos.

novo emparelhamento M

Emparelhamentos
Teorema (Berge): Um emparelhamento M mximo se e
somente no existe caminho M-aumentante no grafo.

Emparelhamentos
O Teorema de Berge sugere o seguinte algoritmo para
encontrar um emparelhamento mximo:
Algoritmo para encontrar um emparelhamento mximo
Dado o grafo G, constri um emparelhamento mximo M em G
M um emparelhamento inicial qualquer -- inicializao de M
enquanto existe um caminho M-aumentante P em G faa
M M E(P)
fim-enquanto
retorne M

Emparelhamentos
Exemplo: Simulao da execuo do algoritmo.
grafo de entrada
c

b
a

x
z

y
j

Emparelhamentos
Exemplo: Simulao da execuo do algoritmo.
emparelhamento inicial M
c

b
a

x
z

y
j

Emparelhamentos
Exemplo: Simulao da execuo do algoritmo.
caminho M-aumentante P
c

b
a

x
z

y
j

Emparelhamentos
Exemplo: Simulao da execuo do algoritmo.
novo emparelhamento M
c

b
a

x
z

y
j

Emparelhamentos
Exemplo: Simulao da execuo do algoritmo.
caminho M-aumentante P
c

b
a

x
z

y
j

Emparelhamentos
Exemplo: Simulao da execuo do algoritmo.
novo emparelhamento M
c

b
a

x
z

y
j

Emparelhamentos
Exemplo: Simulao da execuo do algoritmo.
no h caminho M-aumentante M mximo!
c

b
a

x
z

y
j

Fluxos em redes
Def.: Uma rede um multidigrafo D=(V, E) onde cada
aresta e em E possui uma capacidade real c(e) > 0.

4
1

2
3

3
3

Fluxos em redes
Supomos que h na rede dois vrtices especiais s (origem)
e t (destino), tais que: s uma fonte que alcana todos os
demais, e t um sumidouro alcanado por todos os demais.

4
1

Fluxos em redes
Def.: Um fluxo uma funo f : E R+ tal que:
(1) f (e) c(e), para toda aresta e em E;
(2) x f (x, v) = z f (v, z), para todo v em V \ {s,t}.

4
1

Fluxos em redes
Def.: Um fluxo uma funo f : E R+ tal que:
(1) f (e) c(e), para toda aresta e em E;
(2) x f (x, v) = z f (v, z), para todo v em V \ {s,t}.

4 2
1 1

2 2
3 0

3 2

fluxo

2 1

b
4 3

3 1

capacidade

3 1

5 2

Fluxos em redes
Def.: Um fluxo uma funo f : E R+ tal que:
(1) f no ultrapassa as capacidades (propr. de viabilidade)
(2) f se conserva em todo v s,t (propr. de conservao)

4 2
1 1

2 2
3 0

3 2

fluxo

2 1

b
4 3

3 1

capacidade

3 1

5 2

Fluxos em redes
O valor do fluxo em v s,t vale x f (x, v) (ou z f (v, z)).
O valor do fluxo em s z f (s, z), e em t x f (x, t).

4 2
1 1

2 2
3 0

3 2

fluxo

2 1

b
4 3

3 1

capacidade

3 1

5 2

Fluxos em redes
O valor do fluxo em v s,t vale x f (x, v) (ou z f (v, z)).
O valor do fluxo em s z f (s, z), e em t x f (x, t).
3

4 2
1 1

2 2

3 0

3 2

fluxo

2 1

4
4 3

3 1

capacidade

3 1
valor do fluxo no vrtice

5 2

d
3

Fluxos em redes
O valor do fluxo na rede D denotado por f (D) e
definido como f (D) = z f (s, z) (valor do fluxo em s)
3

4 2
1 1

2 2

3 0

3 2

fluxo

2 1

4
4 3

3 1

capacidade

3 1
valor do fluxo no vrtice

5 2

d
3

Fluxos em redes
O valor do fluxo na rede D denotado por f (D) e
definido como f (D) = z f (s, z) (valor do fluxo em s)

4 2
1 1

2 2
3 0

3 2

fluxo

2 1

b
4 3

3 1

capacidade

3 1
valor do fluxo na rede 4

5 2

Fluxos em redes
O valor do fluxo na rede D denotado por f (D) e
definido como f (D) = z f (s, z) (valor do fluxo em s)

4 2
1 1

2 2
3 1

3 2

fluxo

2 1

b
4 4

3 2

capacidade

3 1
valor do fluxo na rede 5

5 3

Fluxos em redes
O valor do fluxo na rede D denotado por f (D) e
definido como f (D) = z f (s, z) (valor do fluxo em s)

4 3
1 1

2 2
3 1

3 3

fluxo

2 1

b
4 4

3 2

capacidade

3 1

valor do fluxo na rede 6

5 3

Fluxos em redes
Problema do Fluxo Mximo:
Dada uma rede D, encontrar um fluxo f de valor mximo.

4 3
1 1

2 2
3 1

3 3

fluxo

2 1

b
4 4

3 2

capacidade

3 1

valor do fluxo na rede 6

5 3

Fluxos em redes
Problema do Fluxo Mximo:
Dada uma rede D, encontrar um fluxo f de valor mximo.

4 3
1 1

2 2
3 2

3 3

fluxo

2 1

b
4 4

3 2

capacidade

3 0

valor do fluxo na rede 7

5 4

Fluxos em redes
Problema do Fluxo Mximo:
Dada uma rede D, encontrar um fluxo f de valor mximo.

4 3
1 1

2 2
3 2

3 3

fluxo

2 1

b
4 4

3 2

capacidade

3 0

Fluxo mximo!

5 4

Fluxos em redes
Def.: Uma aresta est saturada quando f (e) = c(e).

Fluxos em redes
Def.: Uma aresta est saturada quando f (e) = c(e).

4 3
1 1

2 2

3 1
capacidade
fluxo
fluxo na rede
aresta saturada

3 3

2 1

4 4

3 2

b
3 1

5 3

Fluxos em redes
Def.: Um fluxo dito maximal quando todo caminho
direcionado de s a t contm uma aresta saturada.

4 3
1 1

2 2

3 1
capacidade
fluxo
fluxo na rede
aresta saturada

3 3

2 1

4 4

3 2

b
3 1

5 3

Fluxos em redes
Def.: Um fluxo dito maximal quando todo caminho
direcionado de s a t contm uma aresta saturada.

4 3
1 1

2 2

3 1
capacidade
fluxo
fluxo na rede
aresta saturada

3 3

2 1

4 4

3 2

b
3 1

Fluxo maximal !

5 3

Fluxos em redes
Um fluxo maximal quando no possvel aumentar o
seu valor apenas com acrscimo de fluxo nas arestas.

4 3
1 1

2 2

3 1
capacidade
fluxo
fluxo na rede
aresta saturada

3 3

2 1

4 4

3 2

b
3 1

Fluxo maximal !

5 3

Fluxos em redes
Todo fluxo mximo maximal.
Nem todo fluxo maximal mximo.

4 3
1 1

2 2

3 1
capacidade
fluxo
fluxo na rede
aresta saturada

3 3

2 1

4 4

3 2

b
3 1

Fluxo maximal !

5 3

Fluxos em redes
Todo fluxo mximo maximal.
Nem todo fluxo maximal mximo.

4 3
1 1

2 2

3 1
capacidade
fluxo
fluxo na rede
aresta saturada

3 3

2 1

4 4

3 2

b
3 1

Fluxo maximal !

5 3

d
mas no mximo!

Fluxos em redes
Def.: Seja S V tal que s S e t S. Seja S = V S.
Um corte (S, S ) o conjunto de arestas com um extremo
em S e o outro em S.

Fluxos em redes
Def.: Seja S V tal que s S e t S. Seja S = V S.
Um corte (S, S ) o conjunto de arestas com um extremo
em S e o outro em S.

s
S

b
a

Fluxos em redes
Def.: Seja S V tal que s S e t S. Seja S = V S.
Um corte (S, S ) o conjunto de arestas com um extremo
em S e o outro em S.

s
S

b
a

Fluxos em redes
Idia: Todo caminho direcionado de s a t tem que passar
por alguma aresta do corte.

s
S

b
a

Fluxos em redes
S = {s, a, b}
S = {t, c, d }
(S, S ) = { (s, c), (b, c), (c, b), (b, d), (d, a) }

s
S

b
a

Fluxos em redes
S = {s}
S = {t, a, b, c, d}
(S, S ) = { (s, a), (s, b), (s, c) }

c
S

b
a

Fluxos em redes
S = {s, a, b, c, d}
S = {t}
(S, S ) = { (c, t), (d, t) }

b
a

Fluxos em redes
Def.: (S, S )+ o conj. de arestas que vo de S a S.
(S, S )- o conj. de arestas que vo de S a S.

Fluxos em redes
Def.: (S, S )+ o conj. de arestas que vo de S a S.
(S, S )- o conj. de arestas que vo de S a S.

s
S

b
a

Fluxos em redes
S = { s, a, b }
(S, S )+ = { (s, c), (b, c), (b, d) }
(S, S ) = { (c, b), (d, a) }

s
S

b
a

Fluxos em redes
Def.: A capacidade c(S, S ) de um corte (S, S ) a soma
das capacidades das arestas de (S, S )+.

Fluxos em redes
Def.: A capacidade c(S, S ) de um corte (S, S ) a soma
das capacidades das arestas de (S, S )+.

4
1

Fluxos em redes
Def.: A capacidade c(S, S ) de um corte (S, S ) a soma
das capacidades das arestas de (S, S )+.

4
1

Fluxos em redes
Def.: A capacidade c(S, S ) de um corte (S, S ) a soma
das capacidades das arestas de (S, S )+.

4
1

Fluxos em redes
S = { s, a, b }
c(S, S ) = c(s, c) + c(b, c) + c(b, d) = 4 + 1 + 4 = 9

4
1

Fluxos em redes
S = {s, a, b, c, d}
c(S, S ) = c(c, t) + c(d, t) = 3 + 5 = 8

Fluxos em redes
S = { s, a, b, c }
c(S, S ) = c(b, d) + c(c, t) = 3 + 4 = 7

4
1

Fluxos em redes
Observe que os cortes tm capacidades cada vez
menores!

4
1

Fluxos em redes
Problema do Corte Mnimo: Dada uma rede D, encontrar
um corte (S, S) com a menor capacidade possvel.

4
1

Fluxos em redes
Def.: O fluxo f(S, S ) em um corte (S, S ) a soma dos
fluxos nas arestas de ( S, S )+ menos a soma dos fluxos
nas arestas de (S, S ) .

Fluxos em redes
Def.: O fluxo f(S, S ) em um corte (S, S ) a soma dos
fluxos nas arestas de ( S, S )+ menos a soma dos fluxos
nas arestas de (S, S ) .

4 3
1 1

2 2
3 1

3 3

2 1

4 4

3 2

b
3 1

5 3

Fluxos em redes
S = { s, a, b }
f(S, S ) = f(s, c) + f(b, c) + f(b, d) f (c, b) f (d, a) =
3+1+411=6

4 3
1 1

2 2
3 1

3 3

2 1

4 4

3 2

b
3 1

5 3

Fluxos em redes
S = {s, a, b, c, d}
f(S, S ) = f(c, t) + f(d, t) = 3 + 3 = 6

4 3
1 1

2 2
3 1

3 3

2 1

4 4

3 2

b
3 1

5 3

Fluxos em redes
S = { s, a, b, c }
f(S, S ) = f(b, d) + f(c, t) f(d, a) = 3 + 4 1 = 6

4 3
1 1

2 2
3 1

3 3

2 1

4 4

3 2

b
3 1

5 3

Fluxos em redes
Observe que o valor do fluxo em qualquer corte sempre
o mesmo, e igual ao fluxo f(D) na rede!

4 3
1 1

2 2
3 1

3 3

2 1

4 4

3 2

b
3 1

5 3

Fluxos em redes
f(D) = f(S, S ) para S = {s}.

4 3
1 1

2 2
3 1

3 3

2 1

4 4

3 2

b
3 1

5 3

Fluxos em redes
Teorema: Seja f um fluxo em uma rede D e (S, S ) um
corte qualquer em D. Ento f(S, S ) = f (D).

4 3
1 1

2 2
3 1

3 3

2 1

4 4

3 2

b
3 1

5 3

Fluxos em redes
Teorema: Seja f um fluxo qualquer em uma rede D, e
(S, S ) um corte qualquer em D. Ento f (D) c(S, S ).

Fluxos em redes
Teorema: Seja f um fluxo qualquer em uma rede D, e
(S, S ) um corte qualquer em D. Ento f (D) c(S, S ).

4 3
1 1

2 2
3 1

3 3

2 1

4 4

3 2

b
3 1

5 3

Fluxos em redes
f (D) = 6 c(S, S ) = 9

4 3
1 1

2 2
3 1

3 3

2 1

4 4

3 2

b
3 1

5 3

Fluxos em redes
f (D) = 6 c(S, S ) = 8

4 3
1 1

2 2
3 1

3 3

2 1

4 4

3 2

b
3 1

5 3

Fluxos em redes
f (D) = 6 c(S, S ) = 9

4 3
1 1

2 2
3 1

3 3

2 1

4 4

3 2

b
3 1

5 3

Fluxos em redes
f (D) = 7 c(S, S ) = 9

4 3
1 1

2 2
3 2

3 3

2 1

4 4

3 2

b
3 0

5 4

Fluxos em redes
f (D) = 7 c(S, S ) = 7

4 3
1 1

2 2
3 2

3 3

2 1

4 4

3 2

b
3 0

5 4

Fluxos em redes
Teorema: Seja f um fluxo mximo em uma rede D, e
(S, S ) um corte mnimo em D. Ento f (D) = c(S, S ).

4 3
1 1

2 2
3 2

3 3

2 1

4 4

3 2

b
3 0

5 4

Fluxos em redes
Def.: Dado um fluxo f numa rede D,
uma aresta e direta se c(e) f (e) > 0
uma aresta e contrria se f (e) > 0

Fluxos em redes
Def.: Dado um fluxo f numa rede D,
uma aresta e direta se c(e) f (e) > 0
uma aresta e contrria se f (e) > 0

4 0
1 1

2 2
3 3

3 1

2 0

4 4

3 3

b
3 0

5 4

Fluxos em redes
Def.: Dado um fluxo f numa rede D,
uma aresta e direta se c(e) f (e) > 0
uma aresta e contrria se f (e) > 0

4 0
1 1

2 2
3 3

3 1

2 0

4 4

3 3

b
3 0

arestas diretas

5 4

Fluxos em redes
Def.: Dado um fluxo f numa rede D,
uma aresta e direta se c(e) f (e) > 0
uma aresta e contrria se f (e) > 0

4 0
1 1

2 2
3 3

3 1

2 0

4 4

3 3

b
3 0

arestas contrrias

5 4

Fluxos em redes
Def.: Dado um fluxo f numa rede D,
uma aresta e direta se c(e) f (e) > 0
uma aresta e contrria se f (e) > 0

4 0
1 1

2 2
3 3

3 1

2 0

4 4

3 3

b
3 0

5 4

arestas simultaneamente diretas/contrrias

Fluxos em redes
Def.: Dados D e f, define-se a rede residual D = (V, E):

(x,y) direta (x,y) E c/ capacidade c(x,y) = c(x,y) f(x,y)


(x,y) contrria (y,x) E c/ capacidade c(y,x) = f(x,y)

Fluxos em redes
Def.: Dados D e f, define-se a rede residual D = (V, E):
(x,y) direta (x,y) E c/ capacidade c(x,y) = c(x,y) f(x,y)
(x,y) contrria (y,x) E c/ capacidade c(y,x) = f(x,y)

4 2
1 1

2 2
3 0

3 2

2 1

4 3

3 1

b
3 1

5 2

Fluxos em redes
Def.: Dados D e f, define-se a rede residual D = (V, E):
(x,y) direta (x,y) E c/ capacidade c(x,y) = c(x,y) f(x,y)
(x,y) contrria (y,x) E c/ capacidade c(y,x) = f(x,y)

4 2
1 1

2 2
3 0

3 2

2 1

4 3

3 1

b
3 1

aresta direta de D

5 2

Fluxos em redes
Def.: Dados D e f, define-se a rede residual D = (V, E):
(x,y) direta (x,y) E c/ capacidade c(x,y) = c(x,y) f(x,y)
(x,y) contrria (y,x) E c/ capacidade c(y,x) = f(x,y)

4 2
1 1

2 2

s
3

3 2

2 1

4 3

3 1

b
3 1

aresta de D

5 2

Fluxos em redes
Def.: Dados D e f, define-se a rede residual D = (V, E):
(x,y) direta (x,y) E c/ capacidade c(x,y) = c(x,y) f(x,y)
(x,y) contrria (y,x) E c/ capacidade c(y,x) = f(x,y)

4 2
1 1

2 2

s
3

3 2

2 1

4 3

3 1

b
3 1

aresta contrria de D

5 2

Fluxos em redes
Def.: Dados D e f, define-se a rede residual D = (V, E):
(x,y) direta (x,y) E c/ capacidade c(x,y) = c(x,y) f(x,y)
(x,y) contrria (y,x) E c/ capacidade c(y,x) = f(x,y)

4 2
1 1

3 2

2 1

4 3

3 1

3 1

aresta de D

5 2

Fluxos em redes
Def.: Dados D e f, define-se a rede residual D = (V, E):
(x,y) direta (x,y) E c/ capacidade c(x,y) = c(x,y) f(x,y)
(x,y) contrria (y,x) E c/ capacidade c(y,x) = f(x,y)

4 2
1 1

3 2

2 1

4 3

3 1

3 1

5 2

aresta simultaneamente direta/contrria de D

Fluxos em redes
Def.: Dados D e f, define-se a rede residual D = (V, E):
(x,y) direta (x,y) E c/ capacidade c(x,y) = c(x,y) f(x,y)
(x,y) contrria (y,x) E c/ capacidade c(y,x) = f(x,y)

4 2
1 1

2 1

4 3

3 1

3 1

arestas de D

5 2

Fluxos em redes
Def.: Dados D e f, define-se a rede residual D = (V, E):
(x,y) direta (x,y) E c/ capacidade c(x,y) = c(x,y) f(x,y)
(x,y) contrria (y,x) E c/ capacidade c(y,x) = f(x,y)

4 2
1 1

2 1

4 3

3 1

3 1

5 2

aresta simultaneamente direta/contrria de D

Fluxos em redes
Def.: Dados D e f, define-se a rede residual D = (V, E):
(x,y) direta (x,y) E c/ capacidade c(x,y) = c(x,y) f(x,y)
(x,y) contrria (y,x) E c/ capacidade c(y,x) = f(x,y)

2
2

1 1

2 1

4 3

3 1

3 1

arestas de D

5 2

Fluxos em redes
Def.: Dados D e f, define-se a rede residual D = (V, E):
(x,y) direta (x,y) E c/ capacidade c(x,y) = c(x,y) f(x,y)
(x,y) contrria (y,x) E c/ capacidade c(y,x) = f(x,y)

2
2

1 1

2 1

4 3

3 1

3 1

aresta contrria de D

5 2

Fluxos em redes
Def.: Dados D e f, define-se a rede residual D = (V, E):
(x,y) direta (x,y) E c/ capacidade c(x,y) = c(x,y) f(x,y)
(x,y) contrria (y,x) E c/ capacidade c(y,x) = f(x,y)

2
2

2 1

4 3

3 1

3 1

aresta de D

5 2

Fluxos em redes
Def.: Dados D e f, define-se a rede residual D = (V, E):
(x,y) direta (x,y) E c/ capacidade c(x,y) = c(x,y) f(x,y)
(x,y) contrria (y,x) E c/ capacidade c(y,x) = f(x,y)

2
2

2 1

4 3

3 1

3 1

5 2

arestas simultaneamente diretas/contrrias de D

Fluxos em redes
Def.: Dados D e f, define-se a rede residual D = (V, E):
(x,y) direta (x,y) E c/ capacidade c(x,y) = c(x,y) f(x,y)
(x,y) contrria (y,x) E c/ capacidade c(y,x) = f(x,y)

2
1

b
2

1
2

rede residual D completa

Fluxos em redes
Def.:Uma aresta e da rede residual D aresta de aumento
de fluxo se criada a partir de uma aresta direta de D.

Fluxos em redes
Def.:Uma aresta e da rede residual D aresta de aumento
de fluxo se criada a partir de uma aresta direta de D.

b
2

1
2

rede residual D

Fluxos em redes
Def.:Uma aresta e da rede residual D aresta de aumento
de fluxo se criada a partir de uma aresta direta de D.

2
1

b
2

1
2

arestas de aumento de fluxo

Fluxos em redes
Def.:Uma aresta e da rede residual D aresta de reduo
de fluxo se criada a partir de uma aresta contrria de D.

Fluxos em redes
Def.:Uma aresta e da rede residual D aresta de reduo
de fluxo se criada a partir de uma aresta contrria de D.

b
2

1
2

rede residual D

Fluxos em redes
Def.:Uma aresta e da rede residual D aresta de reduo
de fluxo se criada a partir de uma aresta contrria de D.

2
1

b
2

1
2

arestas de reduo de fluxo

Fluxos em redes
Note que a rede residual D na verdade um mapa das
possveis variaes de fluxo nas arestas!

Fluxos em redes
Note que a rede residual D na verdade um mapa das
possveis variaes de fluxo nas arestas!

b
2

1
2

rede residual D

Fluxos em redes
Note que a rede residual D na verdade um mapa das
possveis variaes de fluxo nas arestas!

2
1

b
2

1
2

arestas de aumento/reduo de fluxo em D

Fluxos em redes
Def.: Um caminho aumentante um caminho de s a t na
rede residual D.

Fluxos em redes
Def.: Um caminho aumentante um caminho de s a t na
rede residual D.

2
1

b
2

1
2

Fluxos em redes
Def.: Um caminho aumentante um caminho de s a t na
rede residual D.

2
1

b
2

1
2

exemplo de caminho aumentante

Fluxos em redes
Def.: Um caminho aumentante um caminho de s a t na
rede residual D.

2
1

b
2

1
2

exemplo de caminho aumentante

Fluxos em redes
Def.: Um caminho aumentante um caminho de s a t na
rede residual D.

2
1

b
2

1
2

exemplo de caminho aumentante

Fluxos em redes
Def.: O gargalo de um caminho aumentante em D a
menor capacidade de uma aresta ao longo deste caminho.

Fluxos em redes
Def.: O gargalo de um caminho aumentante em D a
menor capacidade de uma aresta ao longo deste caminho.

b
2

1
2

gargalo igual a 1

Fluxos em redes
Def.: O gargalo de um caminho aumentante em D a
menor capacidade de uma aresta ao longo deste caminho.

b
2

1
2

gargalo igual a 1

Fluxos em redes
Def.: O gargalo de um caminho aumentante em D a
menor capacidade de uma aresta ao longo deste caminho.

b
2

1
2

gargalo igual a 1

Fluxos em redes
Lema: Dados D e f, se h um caminho aumentante em D
cujo gargalo g, ento existe um fluxo fnovo em D com
valor fnovo(D) = f (D) + g.

Fluxos em redes
Lema: Dados D e f, se h um caminho aumentante em D
cujo gargalo g, ento existe um fluxo fnovo em D com
valor fnovo(D) = f (D) + g.
Demonstrao:
Seja e1 e2 e3 ... ek um caminho aumentante em D com gargalo g.
Sejam e1 , e2 , e3 , ... , ek as arestas correspondentes em D.
Para j = 1, 2, ..., k, faa:
se ej aresta de aumento de fluxo, ento fnovo(ej) = f (ej) + g
se ej aresta de reduo de fluxo, ento fnovo(ej) = f (ej) g
Para as demais arestas de D, faa fnovo(ej) = f (ej).

Fluxos em redes
Ilustrao do lema

Fluxos em redes
Ilustrao do lema

4 2
1 1

2 2
3 0

3 2

2 1

4 3

3 1

b
3 1

5 2

rede D com fluxo f tal que f(D)=4

Fluxos em redes
Ilustrao do lema

2
1

b
2

1
2

rede residual Dde D

Fluxos em redes
Ilustrao do lema

2
1

b
2

1
2

caminho aumentante em Dcom gargalo 1

Fluxos em redes
Ilustrao do lema

4 2
1 1

2 2
3 0

3 2

2 1

4 3

3 1

b
3 1

5 2

arestas correspondentes em D

Fluxos em redes
Ilustrao do lema

4 2
1 1

2 2

3 0

3 2

2 1

4 3

3 1

b
3 1

+
5 2

arestas correspondentes em D

Fluxos em redes
Ilustrao do lema

4 2
1 1

2 2

3 1

3 2

2 1

4 3

3 1

b
3 0

+
5 3

novo fluxo fnovo em D tal que fnovo(D) = 5

Fluxos em redes
Teorema: Dados D e f, temos que:
f fluxo mximo sss no h caminho aumentante em D.

Fluxos em redes
Teorema: Dados D e f, temos que:
f fluxo mximo sss no h caminho aumentante em D.

4 3
1 1

2 2
3 2

3 3

2 1

4 4

3 2

b
3 0

5 4

fluxo f mximo com valor f (D) = 7

Fluxos em redes
Teorema: Dados D e f, temos que:
f fluxo mximo sss no h caminho aumentante em D.

t
1

rede residual D relativa ao fluxo f

Fluxos em redes
Teorema: Dados D e f, temos que:
f fluxo mximo sss no h caminho aumentante em D.

t
1

no h caminho aumentante na rede residual D!

Fluxos em redes
Teorema: Seja f um fluxo mximo em uma rede D, e
(S, S ) um corte mnimo em D. Ento f (D) = c(S, S ).

Fluxos em redes
Teorema: Seja f um fluxo mximo em uma rede D, e
(S, S ) um corte mnimo em D. Ento f (D) = c(S, S ).

4 3
1 1

2 2
3 2

3 3

2 1

4 4

3 2

b
3 0

5 4

Fluxos em redes
f (D) = 7 = c(S, S )

4 3
1 1

2 2
3 2

3 3

2 1

4 4

3 2

b
3 0

5 4

Fluxos em redes
Corolrio: Sejam f fluxo e (S, S ) corte em D. Ento:
(S, S ) mnimo sss toda aresta de ( S, S )+ est saturada
e toda aresta de (S, S ) tem fluxo zero.

4 3
1 1

2 2
3 2

3 3

2 1

4 4

3 2

b
3 0

5 4

Fluxos em redes
Algoritmo para determinar um fluxo mximo
Entrada: Uma rede D
f fluxo inicial qualquer
D rede residual de D relativa ao fluxo f
enquanto D tem caminho aumentante e1 e2 e3 ... ek faa
g gargalo do caminho aumentante e1 e2 e3 ... ek
para j = 1, 2, ..., k faa
seja ej a aresta de D correspondente a ej
se ej aresta de aumento de fluxo ento f (ej) = f (ej) + g
se ej aresta de reduo de fluxo ento f (ej) = f (ej) g
fim-para
D rede residual de D relativa ao novo fluxo f
fim-enquanto
retornar f