Logo Passei Direto
Buscar

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

Prof. Tarcisio Rocha
Algoritmos em Grafos
Prof. Tarcisio Rocha
Livro Texto: 
• Cormen, T., Leiserson, C., Rivest, R. and Stein, C. “Algoritmos – Teoria e Prática”, Elsevier, 2002.
Busca em Largura
� Considere:
� um grafo G = (V, E)
� um vértice de origem s, 
� Busca em largura: 
� explora sistematicamente as arestas de G até descobrir cada vértice � explora sistematicamente as arestas de G até descobrir cada vértice 
acessível a partir de s;
� calcula a distância (caminho mais curto) desde s até todos os vértices 
acessíveis a partir de s.
� “em largura”
� Descobre todos os vértices à distância k a partir de s, antes de descobrir 
quaisquer vértices à distância k + 1.
Busca em Largura
� Controle do andamento do algoritmo
� Utiliza três tipos de marcações para os vértices
� Vértice branco
� É um vértice ainda não descoberto pelo algoritmo 
� Vértice cinza
� É um vértice que já foi descoberto pelo algoritmo mas que ainda 
possui vértices adjacentes não descobertos.
� Vértice preto
� É um vértice que já foi descoberto pelo algoritmo e que não possui 
nenhum vértice adjacente que ainda não foi descoberto.
Busca em Largura
� O Algoritmo:
� G = (V,E) é representado com o uso de listas de adjacência.
� A cada vértice v são adicionadas as seguintes informações
� cor[v] – indica a cor do vértice v
� pi[v] – indica o vértice predecessor de v, ou seja, o vértice a partir do qual [v] – indica o vértice predecessor de v, ou seja, o vértice a partir do qual 
v foi descoberto
� d[v] – indica a distância entre s e v, onde s é o vértice de origem
� O conjunto de vértices de cor cinza é mantido em uma fila Q 
do tipo FIFO (o primeiro a entrar é o primeiro a sair)
Busca em Largura
� O Algoritmo:
Busca em Largura
� Exemplo
Busca em Profundidade
� Tenta-se e explorar novos vértices a partir do vértice mais 
recentemente descoberto.
� Informações
� cor[v] – indica a cor do vértice v (branco, cinza ou preto)
� pi[v] – indica o vértice predecessor de v, ou seja, o vértice a partir do qual 
v foi descobertov foi descoberto
� Dois carimbos de tempo:
� d[v] – indica o “tempo” em que o vértice v foi descoberto (pintado de 
cinza)
� f[v] – indica o “tempo” em que o o algoritmo termina de examinar a 
lista de adjacências de v (v é pintado de preto)
o d[v] e f[v] compartilham o mesmo contador de tempo
o O contador de tempo é um inteiro entre 1 e 2|V|
Busca em Profundidade
Busca em Profundidade
Busca em Profundidade
� Propriedades
� Produz informações sobre a estrutura de um grafo
� Floresta de árvores
� Estrutura de parênteses
� Classificação das arestas
� Arestas de árvore
� Arestas de retorno
� Arestas diretas
� Arestas cruzadas
Busca em Profundidade
� Estrutura de Parênteses
� Representação
� A descoberta de um vértice (u) é representada por “(u”
� O término de um vértice é representado por “u)”
� A história de descobertas e términos forma uma expressão bem 
formada
Retângulos: linha de tempo
Aninhamento: parentesco
Busca em Profundidade
� Classificação das Arestas
� Aresta de árvore
� Arestas na floresta. 
� Arestas de retorno
� Arestas (u, v) que conectam u a um ancestral v em uma árvore.
Busca em Profundidade
� Classificação das Arestas
� Aresta diretas
� Arestas (u, v) que conectam u a um descendente v em uma árvore. 
� Arestas cruzadas
� Todas as outras arestas.
Busca em Profundidade
� Classificação das Arestas
� Aplicação
� Ex: Descoberta de grafos orientados acíclicos: UM GRAFO 
ORIENTADO É ACÍCLICO SSE EM UMA BUSCA EM 
PROFUNDIDADE NÃO É ENCONTRADA NENHUMA ARESTA DE 
RETORNORETORNO
Busca em Profundidade
� Classificação das Arestas
� Como classificar as arestas?
� Cada aresta (u, v) pode ser classificada pela cor do vértice v que é 
alcançado pelo algoritmo
� BRANCO – indica uma aresta de árvore
� CINZA – indica uma aresta de retorno� CINZA – indica uma aresta de retorno
� PRETO – indica uma aresta direta ou cruzada
Busca em Profundidade
� Classificação das Arestas
� Grafos não orientados
� Em uma busca em profundidade de um grafo G, toda aresta de G é uma 
aresta de árvore ou uma aresta de retorno.
Ordenação Topológica
� Definição
� A ordenação toplógica de um gao G=(VG, AG) é uma 
ordenação linear de todos os seus vértices tal que se G contém 
uma aresta (u, v), então u aparece antes de v na ordenação.
� Pode ser vista como uPode ser vista como u
� Aplicação
� Grafos acíclicos orientados (gao’s) 
� Se o grafo não é acíclico, então não é possível nenuma ordenação linear
Ordenação Topológica
� Algoritmo 
� Baseado no algoritmo de busca em profunidade (DFS)
1. Chamar DFS(G) para calcular o tempo de término de f[v] para cada 
vértice v
2. À medida que cada vértice é terminado, inserir o vértice à frente de 
uma lista ligadauma lista ligada
3. Devolva como redultado a lista ligada
Ordenação Topológica
� Exemplo
� Ordenação topológica de vestuário
Ordenação Topológica
� Exemplo
� Ordenação topológica de vestuário
Componentes Fortemente Conectados
� Definição
� Um componente fortemente conectado de um grafo G=(VG, 
AG) é um conjunto máximo de vértices C ⊆VG tal que, para 
todo par de vértices u e v em C:
� u é acessível a partir v
� v é acessível a partir u
Componentes Fortemente Conectados
� O Algoritmo
Árvores Geradoras Mínimas
� Definição 
� Árvore geradora na qual o somatório dos pesos das suas arestas 
é minimo (não existe uma outra árvore geradora que possua um 
somatório de pesos menor)
� ExemploExemplo
� Menor uso de cabos na interconexão de componentes elétricos (o peso 
entre as arestas é a distância entre os componentes)
Árvores Geradoras Mínimas
� Algoritmo Genério
� Tipo guloso
� Parte-se de um vértice (subconjunto da árvore geradora) adicionando 
arestas seguras até completar a árvore 
Árvores Geradoras Mínimas
� Algoritmo Genério
� Definições
� Um corte (S, V-S) de um grafo G=(V,E) é uma partição de V
� Uma aresta que cruza um corte é leve se seu peso é mínimo com relação a 
qualquer outra aresta que cruza o mesmo corte. 
Árvores Geradoras Mínimas
� Algoritmo de Prim
� Durante a execução do algoritmo, todos os vértices que estão em uma fila de 
prioridade mínima Q baseada em um campo chave
� Para cada vértice v, chave[v] é o peso mínimo de qualquer aresta que 
conecta v a um vértice na árvore
w(u,v) – peso da aresta que liga u a v
Árvores Geradoras Mínimas
� Exemplo
(0)
(4)
(8)
(∞)
(∞)
(∞)
(∞)
(∞)
(∞)
(0)
(4)
(8)
(8)
(∞)
(∞)
(∞)
(∞)
(∞)
(8) (∞) (∞) (8) (∞) (∞)
(0)
(4)
(8)
(8)
(2)
(∞)
(7)
(4)
(∞)
(0)
(4)
(7)
(8)
(2)
(6)
(7)
(4)
(∞)
Árvores Geradoras Mínimas
(0)
(4)
(7)
(8)
(2)
(2)
(7)
(4)
(10)
(0)
(4)
(1)
(8)
(2)
(2)
(7)
(4)
(10)
(4) (8) (7) (4) (8) (7)
(0)
(4)
(1)
(8)
(2)
(2)
(7)
(4)
(10)
(0)
(4)
(1)
(8)
(2)
(2)
(7)
(4)
(9)
(0)
(4)
(1)
(8)
(2)
(2)
(7)
(4)
(9)
Caminhos Mais Curtos
� O Algoritmo de Dijkstra
� Calcula o caminho mais curto entre um vértice de origem e os demais 
vértices do grafo
� Operação de relaxamento de aresta (RELAX)
� Relaxar uma aresta (u,v) consiste em tentar melhorar o caminho mais 
curto para v encontrado até agora pela passagem através de u e, nesse curto para v encontrado até agora pela passagem através de u e, nesse 
caso, atualizar d[v] e pi[v]
� d[v] – caminho mais curto da origem até v; pi[v] - antecessor de v
Caminhos Mais Curtos
� O Algoritmo de Dijkstra
Caminhos Mais Curtos
� O Algoritmo de Dijkstra
Coloração Aproximada
� Um Algoritmo
� Q - lista dos vértices ordenados pelos seus graus
� EXTRACT-MAX(Q) – retira de Q o vértice de maior grau
COLORIR(G)
1 for cada u ∈ V[G]1 for cada u ∈ V[G]
2 do cor[u] ← 0
3 cor[r] ← 1
4 Q ← V[G] – r
5 while Q ≠ 0
6 do u ← EXTRACT-MAX(Q)
7 cor ←min { i | cor[Adj[u]] ≠ i} 
8 cor[u] ← cor
Coloração Aproximada
� Exemplos de aplicação
� Ex 1: Estipulação de horários para realização de provas
. D1 D2 D3 D4 D5 D6 D7
D1 . * * * - * *
Disciplinas
D1 . * * * - * *
D2 * . * - - - *
D3 * * . * - - -
D4 * - * . * * -
D5 - - - * . * -
D6 * - - * * . *
D7 * * - - - * .
* = ocorrência de alunos em comum
Coloração Aproximada
� Exemplos de aplicação
� Ex 1: Estipulação de horários para realização de provas
. D1 D2 D3 D4 D5 D6 D7
D1 . * * * - * *
Disciplinas
D1 . * * * - * *
D2 * . * - - - *
D3 * * . * - - -
D4 * - * . * * -
D5 - - - * . * -
D6 * - - * * . *
D7 * * - - - * .
* = ocorrência de alunos em comum
Cor = horário da prova
Coloração Aproximada
� Exemplos de aplicação
� Ex 2: Atribuibuição de armários em uma creche
. 1 2 3 4 5 6 7
7:00 * - - * * - -
Crianças
H
o
r
á
r
i
o
s
 
q
u
e
 
e
s
t
ã
o
 
n
a
 
c
r
e
c
h
e
7:00 * - - * * - -
8:00 * * * - - - -
9:00 * - * * - * -
10:00 * - * - - * *
11:00 * - - - - * *
12:00 * - - - * - -
H
o
r
á
r
i
o
s
 
q
u
e
 
e
s
t
ã
o
 
n
a
 
c
r
e
c
h
e
Coloração Aproximada
� Exemplos de aplicação
� Ex 2: Atribuibuição de armários em uma creche
. 1 2 3 4 5 6 7
7:00 * - - * * - -
Crianças
H
o
r
á
r
i
o
s
 
q
u
e
 
e
s
t
ã
o
 
n
a
 
c
r
e
c
h
e
7:00 * - - * * - -
8:00 * * * - - - -
9:00 * - * * - * -
10:00 * - * - - * *
11:00 * - - - - * *
12:00 * - - - * - -
H
o
r
á
r
i
o
s
 
q
u
e
 
e
s
t
ã
o
 
n
a
 
c
r
e
c
h
e
Cor = armário
Fluxo Máximo em Redes
� Tipos de Redes
� Rede de computadores 
� Fluxo de dados
� Rede elétrica
� Fluxo de energia
� Rede de esgotoRede de esgoto
� Fluxo de água/dejetos
� Rede de abastecimento de água
� Fluxo de água potável
Fluxo Máximo em Redes
� Conceitos Básicos
� Origem (Fonte)
� Produz “material” em uma taxa fixa
� Sorvedor (Destino)
� Consome “material” na mesma taxa da origem
� Fluxo
� Taxa na qual o material se move
Fluxo Máximo em Redes
� Definições
� Fluxo em rede
� É um grafo orientado G=(V, E) em que cada aresta (u, v) ∈ E tem uma 
capacidade não negativa c(u, v) ≥ 0
� Distinguem-se dois vértices em um fluxo em rede:
� Um vértice de origem s� Um vértice de origem s
� Um vértice sorvedor t
Fluxo Máximo em Redes
� Propriedades
� Um fluxo G é uma função de valor real f:VxV → R que satisfaz 
as três propriedades seguintes:
v, uv, u
Fluxo Máximo em Redes
� Definições
� Fluxo total positivo que entra em um vértice v
� ∑ f(u,v)
� Fluxo total positivo que sai de um vértice v
u ∈ V
f(u,v)>0
� ∑ f(v,u)
� Fluxo total líquido de um vértice v
� Diferença entre o fluxo total positivo de saída de v e o fluxo total positivo 
de entrada de v
� Pela propriedade de conservação de fluxo, o fluxo total líquido de um 
vértice deve ser sempre igual a 0
u ∈ V
f(v,u)>0
� Problema de transporte
� Como determinar o número máximo de caixotes que podem 
ser enviados por dia?
� Manter a conservação de fluxo
Exemplo de Fluxo
� Redução a um problema de fluxo máximo comum
Redes com várias origens e sorvedores
superorigem superdestino
� O método de Ford-Fulkerson
� Conceitos necessários
� Redes residuais
� Caminhos aumentantes
� Cortes
Encontrando o fluxo máximo
� Algoritmo genérico
� O método de Ford-Fulkerson
� Redes residuais
� Dados um fluxo em rede e um fluxo, a rede resiual consite em arestas que 
podem admitor mais fluxo
� Definição formal
� Considere um fluxo de rede G=(V,E) com origem s e sorvedor t. 
Encontrando o fluxo máximo
� Considere um fluxo de rede G=(V,E) com origem s e sorvedor t. 
� Seja f um fluxo em G, e considere um par de vértices u, v ∈V. 
� A capacidade residual de (u, v) é a quantidade de fluxo adicional que 
podemos empurrar desde u até v antes de exceder a capacidade c(u, v)
o cf(u,c) = c(u,v) – f(u,v)
� A rede residual de G induzida por f é Gf=(V,Ef)
� O método de Ford-Fulkerson
� Redes residuais
Encontrando o fluxo máximo
R
e
d
e
s
 
r
e
s
i
d
u
a
i
s
� O método de Ford-Fulkerson
� Caminhos aumentantes
� Dados um fluxo em rede G=(V,E) e um fluxo f, um caminho aumentante 
p é um caminho desde s até t na rede residual Gf
� Capacidade residual de p
� Quantidade máxima pela qual podemos aumentar o fluxo em cada 
Encontrando o fluxo máximo
� Quantidade máxima pela qual podemos aumentar o fluxo em cada 
aresta de p 
o cf(p) = min{cf(u,v): (u,v) está em p}
� O método de Ford-Fulkerson
� Caminho aumentante
Encontrando o fluxo máximo
� O método de Ford-Fulkerson
� Cortes de fuxo em redes
� Um corte (S,T) de um fluxo em rede G=(V,E) é uma partição de V em S 
e T=V-S tal que s∈S e t∈T
� Se f é um fluxo, então o fluxo líquido pelo corte (S,T) é definido como 
f(S,T).
Encontrando o fluxo máximo
f(S,T).
� A capacidade do corte (S,T) é c(S,T)
� Um corte mínimo de uma rede é um corte cuja capacidade é mínima 
dentre todos os cortes da rede
� O método de Ford-Fulkerson
� Cortes de fuxo em redes
� Exemplo
� Corte ({s, v1, v2}, {v3, v4, t})
� Fluxo líquido: f(v1,v3) + f(v2,v3) + f(v2,v4) = 12+(-4)+11 = 19
Encontrando o fluxo máximo
� Capacidade: c(v1,v3) + c(v2,v4) = 12+14 = 26
� O algoritmo básico de Ford-Fulkerson
� A cada interação, encontramos algum caminho aumentante p e 
aumentamos o fluxo f em cada aresta de p pela capacidade 
residual cf(p) 
Encontrando o fluxo máximo
� O algoritmo básico de Ford-Fulkerson
Encontrando o fluxo máximo
� O algoritmo básico de Ford-Fulkerson
Encontrando o fluxo máximo
� Emparelhamento em grafos bipartidos
Emparelhamento bipartido máximo
Como encontrar um emparelhamento máximo?
� Emparelhamento máximo a partir de um fluxo em rede
� Artifício
� Construir um fluxo em rede G´=(V´,E´) a partir do grafo bipartido 
G=(V,E) no qual os fluxos equivalem a emparelhamentos
� A origem s e o sorvedor t são novos vertices não pertencentes a V
� V´=V∪{s,t}
Emparelhamento bipartido máximo
� V´=V∪{s,t}
� Se a partição de vértices de G é V = L ∪ R, as arestas orientadas de G´são 
arestas de E, orientadas de L para R, junto com |V| novas arestas
� Atribui-se capacidade unitária a cada aresta
� Usa-se o método de Ford-Fulkerson para encontrar um fluxo máximo
� O caminho aumentante escolhido deve ser o lexicograficamente 
menor
� O fluxo máximo resultante corresponderá a um emparelhamento 
máximo no subgrafo bipartido G de G´
� Emparelhamento máximo a partir de um fluxo em rede
Emparelhamento bipartido máximo
G G´

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?