Escolar Documentos
Profissional Documentos
Cultura Documentos
1
Algoritmos e Complexidade
Eficiência de um algoritmo
• Complexidade de tempo: quanto “tempo” é necessário
para computar o resultado para uma instância do
problema de tamanho n
– Pior caso: Considera-se a instância que faz o
algoritmo funcionar mais lentamente
– Caso médio: Considera-se todas as possíveis
instâncias e mede-se o tempo médio
Eficiência de uma estrutura de dados
• Complexidade de espaço: quanto “espaço de
memória/disco” é preciso para armazenar a estrutura
(pior caso e caso médio)
Complexidade de espaço e tempo estão freqüentemente
relacionadas
2
Algoritmos e Complexidade
Eficiência medida objetivamente depende de:
• Como o programador implementou o algoritmo/ED
• Características do computador usado para fazer
experimentos:
– Velocidade da CPU
– Capacidade e velocidade de acesso à memória
primária / secundária
– Etc
• Linguagem / Compilador / Sistema Operacional / etc
Portanto, a medição formal de complexidade tem que ser
subjetiva, porém matematicamente consistente
Þ Complexidade assintótica
3
Complexidade Assintótica
Tempo / espaço medidos em número de “passos” do
algoritmo / “palavras” de memória ao invés de segundos
ou bytes
Análise do algoritmo / e.d. permite estimar uma função
que depende do tamanho da entrada / número de dados
armazenados (n).
• Ex.:
Percebe-se que à medida que n aumenta, o termo cúbico
começa a dominar
A constante que multiplica o termo cúbico tem
relativamente a mesma importância que a velocidade da
CPU / memória
Diz-se que T(n) O(n3)
4
Complexidade Assintótica
Definição:
T(n) O( f (n)) se existem constantes c e n0 tais que
T(n) c f (n) para todo n n0
Alternativamente,
T(n) O( f (n)) se lim n T(n) / f (n) é constante (mas
não infinito)
Exemplo:
5
Limite Superior e Limite Inferior
Notação O é usada para estabelecer limites superiores de
complexidade
Para estabelecer limites inferiores de complexidade usa-se a
notação
Definição
T(n) ( f (n)) se existem constantes c e n0 tais que
c f (n) T(n) para todo n n0
Alternativamente,
T(n) ( f (n)) se lim n T(n) / f (n) > 0 para todo n n0
(pode ser, inclusive, infinito)
6
Limites Justos
Observe que se T (n) O (n3) então, T (n) O (n4), T (n) O
(n5), etc
Analogamente, se T (n) (n3) então,
T (n) (n2), T (n) (n), etc
Se uma função T (n) tem como limites superior e inferior a
mesma função f (n), então diz-se que f (n) é um limite justo de
T (n), ou T (n) (f (n))
Definição
• T (n) (f (n)) T (n) O (f (n)) T (n) (f (n))
7
Inventário de funções de complexidade
T (n) O (1) : constante – mais rápido, impossível
T (n) O (log log n) : super-rápido
T (n) O (log n) : logarítmico – muito bom
T (n) O (n) : linear – é o melhor que se pode esperar se
algo não pode ser determinado sem examinar toda a
entrada
T (n) O (n log n) : limite de muitos problemas práticos,
ex.: ordenar uma coleção de números
T (n) O (n2) : quadrático
T (n) O (nk) : polinomial – ok para n pequeno
T (n) O (kn), O (n!), O (nn) : exponencial – evite!
8
Exemplo: Pontos máximos em 2D
Um ponto máximo de uma coleção é um que não é dominado por
nenhum outro (da coleção)
Diz-se que um ponto (x1, y1) domina um ponto
(x2, y2) se x1 x2 e y1 y2
9
Exemplo – Algoritmo Força Bruta
Basta testar todos os pontos e verificar se são máximos:
proc maximos (Inteiro n, Ponto p [1..n]) {
para i desde 1 até n fazer {
dominado ¬ falso
j ¬ 1
enquanto Ødominado Ù j£n fazer {
se i¹j Ù domina (p[j],p[i]) então
dominado ¬ verdadeiro
j ¬ j + 1
}
se Ødominado então reportar (p[i])
}
}
10
Observações sobre pseudo-código
É uma descrição do algoritmo para humanos
Não precisa conter detalhes desnecessários
Ex.: Assumimos que p não contém pontos duplicados, mas este pode
ser um detalhe importante para o implementador
Precisa ser inteligível
Se o algoritmo usa outro algoritmo, este deve ser óbvio ou
deve ser explicitado.
Ex.: função domina deve ser explicitada?
proc domina (Ponto p, Ponto q) {
retornar p.x ³ q.x Ù p.y ³ q.y
}
11
Análise de complexidade (pior caso)
O pior caso acontece quando todos os pontos são máximos
O interior do laço mais interno tem complexidade
constante, digamos 2 (o comando “se” e a atribuição a “j”)
O laço mais interno tem complexidade
12
Somatórios
Propriedades
13
Alguns somatórios notáveis
14
Resolvendo somatórios
O que faríamos se não soubéssemos que
15
Resolvendo somatórios por indução
Formula-se um palpite e tenta-se prová-lo. Ex.:
16
Resolvendo somatórios por indução
Prova do caso genérico:
• Coeficientes de potências iguais têm “bater”
17
Ordenação de Arrays
Operação de grande importância teórica e prática
Muitos algoritmos conhecidos com complexidade
O(n log n):
• HeapSort
• QuickSort
• MergeSort
Freqüentemente, algoritmos com complexidade assintótica
pior – tipicamente O(n2) – acabam sendo mais eficientes
para n pequeno:
• BubbleSort
• InsertionSort
18
Dividir para Conquistar
Vamos estudar o MergeSort, um algoritmo sob o princípio
“Dividir para Conquistar” ou “Divide and Conquer”
Consiste de:
• Dividir a tarefa em pequenas subtarefas
• “Conquistar” – resolver cada subtarefa aplicando o
algoritmo recursivamente a cada uma
• Combinar as soluções das subtarefas construindo assim
a solução do problema como um todo
Tipicamente, algoritmos do tipo “Dividir para Conquistar”
são recursivos
Na análise de algoritmos recursivos os limites de
complexidade precisam ser determinados resolvendo
recorrências
19
MergeSort
Considere um array A[1..n]. O algoritmo consiste das
seguintes fases
• Dividir A em 2 sub-coleções de tamanho n/2
• Conquistar: ordenar cada sub-coleção chamando
MergeSort recursivamente
• Combinar as sub-coleções ordenadas formando uma
única coleção ordenada (Merge)
Se uma sub-coleção tem apenas um elemento, ela já está
ordenada e configura o caso base do algoritmo
20
MergeSort
entrada saída
7 5 2 4 1 6 3 0 0 1 2 3 4 5 6 7
7 5 2 4 1 6 3 0 2 4 5 7 0 1 3 6
Dividir Combinar
7 5 2 4 1 6 3 0 5 7 2 4 1 6 03
7 5 2 4 1 6 3 0 7 5 2 4 1 6 3 0
21
MergeSort - Análise
Análise da rotina MergeSort
• Admitamos que T(n) represente a complexidade
(número de passos, comparações, etc) de MergeSort
• Para n = 1, o tempo é constante. Como estamos
desprezando fatores constantes, digamos que T(1) = 1
• Para n > 1, a rotina chama:
– a si mesma, recursivamente:
» Uma vez c/ n valendo n/2
» Outra vez c/ n valendo n - n/2 = n/2
– Merge, que executa n operações
• Portanto, para n >1, T(n) = T (n/2) + T (n/2) + n
22
Resolvendo Recorrências
Vimos que a análise do algoritmo MergeSort resultou
numa fórmula recorrente:
23
Percebendo padrões
Vejamos como T (n) se comporta para alguns valores de n
T(1) = 1
T(2) = T(1) + T(1) + 2 = 1 + 1 + 2 = 4
T(3) = T(2) + T(1) + 3 = 4 + 1 + 3 = 8
T(4) = T(2) + T(2) + 4 = 4 + 4 + 4 = 12
…
T(8) = T(4) + T(4) + 8 = 12 + 12 + 8 = 32
…
T(16) = T(8) + T(8) + 16 = 32 + 32 + 16 = 80
…
T(32) = T(16) + T(16) + 32 = 80 + 80 + 32 = 192
24
Percebendo Padrões
Podemos vislumbrar que como o algoritmo opera dividindo
os intervalos sempre por 2, um padrão pode emergir para
valores de n iguais a potências de 2
De fato observamos o seguinte quando consideramos o valor
de T(n) / n:
T(1) / 1=1
T(2) / 2=2
T(4) / 4=3
T(8) / 8=4
T(16) / 16=5
…
T(2k) / 2k = k+1
Ou seja, para potências de 2, T(n) / n = (log2 n) + 1, ou
T(n) = (n log2 n) + n 25
Provando o Palpite por Indução
Primeiro vamos nos livrar dos arredondamentos T (n/2) e
T (n/2) provando o teorema apenas para valores de n
iguais a potências de 2
Esta hipótese simplificadora se justifica pois o algoritmo
não se comporta de maneira significativamente diferente
quando n não é uma potência de 2
Portanto, temos
27
Método da Iteração
Nem sempre temos intuição suficiente sobre o
funcionamento do algoritmo para dar um palpite correto
O método da iteração permite que se reconheça um padrão
sem necessidade de chutar
Quando funciona, a solução do problema da recorrência é
obtida resolvendo-se um somatório
O método consiste esquematicamente de:
• Algumas iterações do caso geral são expandidas até se
encontrar uma lei de formação
• O somatório resultante é resolvido substituindo-se os
termos recorrentes por fórmulas envolvendo apenas
o(s) caso(s) base
28
Resolvendo o MergeSort por Iteração
29
Resolvendo o MergeSort por Iteração
Temos então
30
Exemplo Mais Complexo de Iteração
Vamos tentar resolver a seguinte recorrência por iteração:
Temos
31
Exemplo Mais Complexo de Iteração
No limite, temos n/4k =1 e portanto, k=log4n.Usando este
valor na equação, temos
32
Exemplo Mais Complexo de Iteração
Temos finalmente
33
Árvores de Recursão
Maneira gráfica de visualizar a estrutura de chamadas
recursivas do algoritmo
Cada nó da árvore é uma instância (chamada recursiva)
Se uma instância chama outras, estas são representadas
como nós-filhos
Cada nó é rotulado com o tempo gasto apenas nas
operações locais (sem contar as chamadas recursivas)
Exemplo: MergeSort
34
Árvore de Recursão do MergeSort
T(n)
n =n
T(n/2) T(n/2) +
n/2 n/2 2(n/2)=n
+
T(n/4)
n/4 n/4 n/4 n/4 4(n/4)=n
+
T(1)
1 1 1 1 1 … 1 n (n/n)=n
n (log2n +1)
35
Árvore de Recursão do MergeSort
Observamos que cada nível de recursão efetua no total n
passos
Como há log2 n + 1 níveis de recursão, o tempo total é
dado por n log2 n + n, o mesmo que encontramos na
solução por iteração
36
Árvore de Recursão – Outro exemplo
T(n)
n 2 n2
T(n/2) +
(n/2)2 (n/2)2 (n/2)2 3(n/2)2=n2(3/4)
T(n/4) +
37
Árvore de Recursão – Outro exemplo
Vemos que a soma das complexidades locais pelos k+1
níveis da recursão nos dá
38
O Teorema Mestre (Simplificado)
Podemos observar que as fórmulas de recorrência
provenientes de algoritmos do tipo Dividir-para-
Conquistar são muito semelhantes
Tais algoritmos tendem a dividir o problema em a partes
iguais, cada uma de tamanho b vezes menor que o
problema original
Quando, além disso, o trabalho executado em cada
instância da recursão é uma potência de n, existe um
teorema que nos dá diretamente a complexidade
assintótica do algoritmo
Em outras palavras, o Teorema Mestre pode resolver
recorrências cujo caso geral é da forma T(n)=a T (n/b) + nk
39
Teorema Mestre Simplificado
Dadas as constantes a 1 e b 1 e uma recorrência da
forma T(n)=a T (n/b) + nk, então,
• Caso 1: se a > bk então T(n) (nlogba)
• Caso 2: se a = bk então T(n) (nk log n)
• Caso 3: se a < bk então T(n) (nk)
(Como antes, assumimos que n é uma potência de b e que
o caso base T(1) tem complexidade constante)
40
Teorema Mestre Simplificado
Exemplos:
• MergeSort: T(n)=2T(n/2)+ n
– a=2, b=2, k=1.
– caso 2 se aplica e T(n) (n log n)
• T(n)=3T(n/2)+ n2
– a=3, b=2, k=2
– caso 3 se aplica (3<22) e T(n) (n2)
• T(n)=2T(n/2)+ n log n
– Teorema mestre (simplificado ou completo) não se
aplica
– Pode ser resolvida por iteração
41
Teorema Mestre e Árvores de Recursão
Os três casos do teorema mestre podem ser entendidos
como as três maneiras de distribuir o trabalho na árvore de
recursão:
• Caso 1: O trabalho é concentrado nas folhas
(ex.: T(n)=4T(n/3)+ n)
• Caso 2: O trabalho é dividido igualmente entre todos os
níveis (ex.: MergeSort)
• Caso 3: O trabalho é concentrado nas raízes
(ex.: 3T(n/2)+ n2)
42
Introdução de Grafos
O assunto no campo teórico se reflete na grande
quantidade de problemas existentes na área, ainda em
processo de estudo
43
Grafos
Um grafo G(V,E) é um conjunto finito não-vazio V e um conjunto E de pares não-
ordenados de elementos distintos de V.
• V representa os vértices
• E representa as arestas
Cada aresta e E será denotada pelos pares de vértices
• v,w são extremidades da aresta e
44
Modelos usando grafos I
Seja uma região formada por vegetarianos e canibais
Inicialmente, dois vegetarianos e dois canibais estão na margem esquerda (ME) do rio
Existe um barco que pode transportar no máximo duas pessoas e sempre atravessa o rio com pelo menos uma pessoa
O objetivo é achar uma forma de transportar os dois vegetarianos e os dois canibais para a margem direita (MD) do
rio
Em nenhum momento o número de canibais numa margem do rio pode ser maior que o número de vegetarianos
Solução:
• Notação para representar cada cenário possível
• Modelo para representar a mudança de um cenário em outro válido
• Notação ME/MD
– vvccB/ → ME: 2v, 2c e o barco; MD: -
– vc/Bvc → ME: 1v, 1c; MD: B, 1v e 1c
• Modelo: grafo
– Vértice: cenário válido
– Aresta: transição válida de um dado cenário em outro
45
Alguns problemas conhecidos
P-Medianas
• Particionar um conjunto de clientes n com demandas conhecidas em p conjuntos, vértices medianas, de
modo a minimizar a soma das distâncias de cada vértice restante até a mediana mais próxima
Produção-Distribuição
• Galpões com capacidade de armazenamento e produção, clientes com capacidade de demanda, veículos
com capacidade de armazenamento e rotas para entrega de produtos. Intuito de minimizar os custos total
das rotas
Rota de Caminhão e Trailer
• A frota de entrega de produtos é formada por veículo heterogêneos, composta por carros/furgões e
trailers. As rotas possuem clientes acessados por somente uma configuração dessa frota, um tipo de
automóvel, ou pelo veículo completo, automóvel adicionado ao trailer. Intuito de reduzir os custos das
rotas
Planejamento de Rede com 2 caminhos
• A partir de um grafo conectado com arestas não direcionadas o problema consiste em se encontrar um
subconjunto de arestas com peso mínimo onde sempre se tenham 2 caminhos se conectando cada par de
vértices origem-destino
Caixeiro Viajante
• Consiste em se percorrer um certo conjunto de pontos (cidades), um ciclo, onde a distância total
percorrida seja a mínima e só se possa visitar cada ponto uma única vez, terminando o ciclo no primeiro
ponto visitado.
Distribuição de energia elétrica
• Mudança na topologia da rede elétrica de forma que mantenha todos os pontos alimentados
Fecho convexo
• A partir de uma nuvem de pontos deseja-se descobrir os pontos máximos deste conjunto como se46
formasse um invólucro para conter o conjunto de pontos
Grafos
V={1,2,3,4,5,6}
E={(1,2),(1,3),(3,2),(3,6),(5,3),(5,1),(5,6),(4,6),(6,1),(6,2),(3,4)}
47
Grafos
Dois grafos são isomorfos se:
• Dado com , existe uma função unívoca , tal que se e
somente , para todo
É desconhecida a existência de algoritmos eficientes que
tratem o problema geral de isomorfismo em grafos
• Resolução por força bruta a partir de n! permutações de
V1
48
Grafos
Laço é formado por u par de vértices idênticos como do
tipo e = (v,v).
50
Grafos
Um grafo G(V,E) é denominado conexo quando existe caminho entre
cada par de vértices de G. Caso contrário é desconexo.
• Grafo n-conexo é um grafo com mais de n vértices e permanece
conexo sempre que são removidos n-1 vértices
• Grafo n-aresta-conexo é um grafo que permanece conexo
enquanto n arestas vão sendo retiradas
52
Grafos – Teorema I
Um grafo G conexo possui ciclo euleriano se e somente se
todo vértice de G possuir grau par.
Prova:
• Seja C um ciclo euleriano de G. Cada ocorrência de
uma dado vértice v em C contribui com 2 unidades para
o cômputo do grau de v. Como cada aresta de G
aparece exatamente uma vez em C, conclui-se que v
possui grau par.
• Corresponde a um algoritmo de complexidade O(n+m)
para encontrar um ciclo euleriano num grafo com n
vértices e m arestas
53
Grafos – Teorema I (cont.)
Denomina-se complemento de um grafo G(V,E) ao grafo G
, o qual possui o mesmo conjuntos de vértices do que G e
tal que para todo par de vértices distintos v, w є V, te-se que
(v,w) é aresta de G se e somente se não o for de G
54
Grafos – Teorema I (cont.)
Um grafo denomina-se completo quando existe uma aresta
entre cada par de seus vértices
• Abaixo vê-se grafos completos
55
Grafos – Teorema II
Um grafo G(V,E) é biparte se e somente se todo o ciclo de G possuir
comprimento par
• O grafo G deve possuir um conjunto de vértices V que possa ser
dividido em 2 grupos, V1 e V2 tais que toda aresta G une um vértice
de V1 a outro de V2.
Prova:
• Seja v1,...,vk, v1 um ciclo de comprimento k do grafo biparte G e
seja v1 є V1. Logo, v2 є V2, v3 є V3 e assim por diante. Como (vk,v1)
є E implica vk є V2. Portanto k é par.
56
Grafos – Teorema II (cont.)
Um subgrafo G2(V2,E2) de um grafo G1(V1,E1) é um grafo tal que V2 V1
e E2 E1. Se além disso, G2 possuir toda aresta (v,w) de G1 tal que ambos
v e w estejam em V2, então G2 é o sub-grafo induzido pelo subconjunto
de vértices V2.
• Os grafos b e c são subgrafos de a, mas somente c é induzido
57
Grafos – Teorema II (cont.)
Um clique de um grafo G é um subgrafo de G que seja
completo.
• Chama-se também conjunto independente de vértices
• Por exemplo, um subgrafo induzido pelo subconjunto
de vértices {2,3,4,6} do grafo abaixo é uma clique de
tamanho 4
58
Grafos - Árvores
Um grafo que não possui ciclos é acíclico
Árvore é aquele grafo T(V,E) que seja acíclico e conexo.
• Se um vértice v da árvore T possuir grau ≤ 1 então v é uma folha,
caso contrário um vértice interior.
• Um conjunto de árvores é denominado floresta.
• Toda árvore T com n vértices tem n-1 arestas
59
Grafos – Árvores – Teorema 3
Um grafo G é uma árvore se e somente se existir um único
caminho entre cada par de vértices de G
Prova:
• Seja G uma árvore. Então G é conexo e portanto existe
pelo menos um caminho entre cada par v,w de vértices
de G. Suponha que existam dois caminho distintos
vP1w e vP2w. Então vP1wP2v é um ciclo, o que contradiz
G ser acíclico.Reciprocamente, se existe exatamente
um caminho entre cada par de vértices de G, então o
grafo é obviamente conexo e, além disso, não pode
conter ciclos. Logo G é uma árvore.
60
Grafos – Árvores – Teorema 4
Seja G(V,E) um grafo. As possíveis afirmativas são
equivalentes:
– G é uma árvore
– G é conexo e |E| é mínimo
– G é conexo e |E| = |V| - 1
– G é acíclico e |E| = |V| - 1
– G é acíclio e para todo v,w є V, a adição da aresta (v,w) produz um
grafo contendo exatamente um ciclo
Denomina-se excentricidade de um vértice v є V ao valor
da distância máxima entre v,w para todo w є V.
• O centro de um grafo é o subconjunto dos vértices de
excentricidade mínima
• O centro de um grafo pode possuir no mínimo um e no
máximo n vértices. O centro de uma árvore possui não
mais do que 2 vértices
61
Grafos – Árvores – Teorema 4
O centro do grafo abaixo é o subconjunto dos vértices {c, d, e}
62
Grafos – Árvores – Teorema 4 – Lema 1
Seja T uma árvore com pelo menos 3 vértices. Seja T’ a
árvore obtida de T pela exclusão de todas as suas folhas.
Então T e T’ possuem o mesmo centro.
Prova (usando o desenho do slide anterior):
• Se um vértice f de T é uma folha então f não pertence
ao centro de T’. Isto porque o vértice g adjacente a f
possui necessariamente excentricidade uma unidade
menor do que a de f. Seja agora um vértice interior v de
T. O vértice w, cuja distância a v é máxima, é
necessariamente uma folha. Logo a exclusão de todas
as folhas de T faz decrescer de uma unidade a
excentricidade de cada um de seus vértices interiores.
Isto nos leva ao próximo slide
63
Grafos – Árvores – Teorema 4
O centro de uma árvore T possui um ou dois vértices
Prova:
• Se T possui até dois vértices o teorema é trivial. Caso contrário,
aplicar repetidamente o lema 1.
– Algortimo: determinação do centro de uma árvore
dados: árvore T(V,E)
enquanto |V| > 2 efetuar:
excluir as folhas da árvore
64
Grafos – Árvores – Teorema 4
Denomina-se subgrafo gerador de um grafo G1(V1,E1) a um subgrafo
G2(V2,E2) de G1 tal que V1 = V2. Quando um subgrafo gerador é uma
árvore, ele recebe o nome de árvore geradora. Os grafos ii e iii são
subgrafos geradores do grafo i, enquanto que o grafo iii é uma árvore
geradora dos outros dois.
65
Grafos – Árvores – Teorema 4
Uma árvore T(V,E) é denominada enraizada quando algum
vértice v є V é escolhido como especial
• No grafo abaixo, o vértice c foi escolhido como raiz
66
Grafos – Árvores – Teorema 4
67
Grafos – Conectividade
Denomina-se conectividade de vértices cv de G à
cardinalidade do menor corte de vértices de G
Denomina-se conectividade de arestas ce de G à
cardinalidade do menor corte de arestas de G
• A cv e ce mínimas para o primeiro grafo são {5} e {(3,5),
(4,5)}, respectivamente, com cardinalidades 1 e 2
68
Grafos – Conectividade
Um vértice v é chamado de articulação quando sua
remoção de G o desconecta
Uma aresta e é chamada de ponte quando sua remoção de
G o desconecta
69
Grafos - Planaridade
Ocorre quando um grafo admite alguma representação
plana sem cruzamento de linhas
70
Grafos – Ciclo Hamiltoniano
É o grafo cujo ciclo contém cada vértice do grafo
exatamente uma vez
• Deve ser garantido de que sempre se existam dois
caminhos disjuntos entre cada par de vértices
• Recíproca não verdadeira
71
Grafos – Ciclo Euleriano
É o grafo cujo ciclo contém cada aresta do grafo
exatamente uma vez
• Todos os nós devem possuir grau par
• Qual grafo pode ser possível se construir com uma
caneta sem levantá-la do papel e sem cobrir uma linha
mais de uma vez
72
Grafos - Coloração
Seja G(V,E) um grafo e um conjunto de cores. Uma coloração de G é uma atribuição de
alguma cor de C para cada vértice de V, de tal modo que a dois vértices adjacentes sejam
atribuídas cores diferentes
• Uma coloração de G é uma função unívoca f:V→C tal que para cada par de vértices v, w V
tem-se que (v,w)
• Uma k-coloração de G é uma coloração f cuja cardinalidade do conjunto imagem é igual a k
• O número cromático X(G) de um grafo G é o número de cores k para o qual existe uma k-
coloração de G
• Uma coloração que utiliza o número mínimo de cores é chamada mínima
• Vértices, arestas ou regiões
73
Grafos - Coloração
Um grafo G é denominado k-crítico quando e para todo
subgrafo próprio H de G, .
• Se G(V,E) é k-crítico então o grau , para todo v
• Grafos 3-crítico e 4-crítico
74
Grafos – Coloração de Mapas
Ilustração de um mapa com 3-coloração (esquerda) e seu
grafo planar correspondente (direita).
75
Grafos – Grafos Direcionados (dígrafos)
São arestas direcionadas a partir de um vértice v para um vértice w
• O grau de saída de um vértice v, em um dígrafo, é a quantidade de arestas divergentes (saem) de v
• O grau de entrada de um vértice v, em um dígrafo, é a quantidade de arestas convergentes de
(chegam) v
• Um dígrafo D(V,E) é fortemente conexo quando para todo par de vértices v,w V existir um
caminho em D de v para w, e também de w para v
– Se ao menos um destes caminhos existir para todo v,w V então D é unilateralmente conexo
– Fonte é um vértice com grau de entrada nulo, e sumidouro um vértice com grau de saída nulo
• Um dígrafo é acíclico quando não possui ciclos direcionados
• D é fracamente conexo ou desconexo conforme seu grafo subjacente seja conexo ou desconexo,
respectivamente
– Grafo (a) é um dígrafo, e grafo (b) é seu subjacente
76
Grafos – Representação Computacional
Dado um grafo G(V,E) a matriz de adjacência é uma
matriz , ou tal que:
• caso contrário
78
Grafos – Representação Computacional
Dado um grafo G(V,E) a matriz de incidência é uma
matriz tal que
• vértice e aresta forem incidents
79
Grafos – Representação Computacional
Utilização da estrutura de listas para criar a lista de
adjacência
Espaço de armazenamento linear
• n listas com um máximo de 2m elementos,
80
Grafos – Coloração
Difícil determinação exata do número cromático de um grafo G
• Opção pela aproximação, na escolha por alguma coloração
razoável
– Os vértices já foram examinados e coloridos
– representa o conjunto de vértices de cor
82
Busca em Grafos
A busca visa resolver uma forma de exploração de um grafo.
A partir de um grafo dado deseja-se obter um processo
sistemático de como caminhar pelos vértices e arestas do mesmo
• Percursos em uma árvore
– Pré-Ordem: raiz, esq, dir
– In-Ordem: esq, raiz, dir
– Pós-Ordem: esq, dir, raiz
83
Busca em Grafos
Marcar um vértice arbitrariamente escolhido
Seleciona-se algum vértice que esteja marcado e seja
incidente a alguma aresta ainda não selecionada
A aresta torna-se selecionada e o vértice marcado (caso
ainda não o seja)
O processo termina quando todas as arestas de G tiverem
sido selecionadas, processo este chamado busca no grafo
G
Um vértice torna-se explorado quando todas as arestas
incidentes ao mesmo tiverem sido explorados
84
Busca em Grafos – Busca Geral
Vértice inicial 1 marcado
• Aresta (1,2) visitada, vértice 2 marcado
• Aresta (1,4) visitada, vértice 4 marcado
Vértice 2
• Aresta (2,3) visitada, vértice 3 marcado
Vértice 4
• Aresta (4,3) visitada
Vértice 2
• Aresta (2,4) visitada
Vértice 1
• Aresta (1,3) visitada
Vértice 4
• Aresta (4,5) visitada, vértice 5 marcado
• ....
dados grafo G(V,E)
escolher e marcar um vértice inicial
enquanto existir algum vértice marcado e incidente a uma aresta não
visitada, efetuar
escolher o vértice e explorer a aresta
se é não marcado então marcar
85
Busca em Grafos – Busca em Profundidade
Critérios específicos na escolha dos vértices marcados
• Dentre todos os vértices marcados e incidentes a alguma aresta ainda não explorada, escolher aquele
mais recentemente alcançado na busca
• Ordenação anterior necessária
– Em I o conjunto de arestas visitadas, chamado de arestas de árvore, constrói uma árvore geradora
– Em II o conjunto de arestas é denominado arestas de retorno ou frondes
caso contrário
se e não são consecutivos em
então visitar ----- II
retirar de
As arestas curvas
representam as frondes
87
Busca em Grafos – Busca em Profundidade
Aplicação em dígrafos
A pilha pode ser ignorada
88
Busca em Grafos – Busca em Profundidade
89
Busca em Grafos – Busca em Profundidade
depthFirstSearch()
para todos os vértices
edges = vazio
i=0
enquanto existe vértice tal que
;
retornar edges;
; Execução
para todos os vértices adjacentes a a b c d e f g h i
se
anexe a aresta a edges num
i=
edges
90
Busca em Grafos – Busca em Profundidade
depthFirstSearch()
para todos os vértices
edges = vazio
i=0
enquanto existe vértice tal que
;
retornar edges;
; Execução
para todos os vértices adjacentes a a b c d e f g h i
se
num 0 0 0 0 0 0 0 0 0
anexe a aresta a edges
i=0
edges
91
Busca em Grafos – Busca em Profundidade
depthFirstSearch()
para todos os vértices
edges = vazio
i=0
enquanto existe vértice tal que
;
retornar edges;
; Execução
para todos os vértices adjacentes a a b c d e f g h i
se
num 0 0 0 0 0 0 0 0 0
anexe a aresta a edges
i=0
edges
92
Busca em Grafos – Busca em Profundidade
depthFirstSearch()
para todos os vértices
edges = vazio
i=0
enquanto existe vértice tal que
;
retornar edges;
; Execução
para todos os vértices adjacentes a a b c d e f g h i
se
num 1 0 0 0 0 0 0 0 0
anexe a aresta a edges
i=1
edges
93
Busca em Grafos – Busca em Profundidade
depthFirstSearch()
para todos os vértices
edges = vazio
i=0
enquanto existe vértice tal que
;
retornar edges;
; Execução
para todos os vértices adjacentes a a b c d e f g h i
se
num 1 0 0 0 0 0 0 0 0
anexe a aresta a edges
i=1
edges
94
Busca em Grafos – Busca em Profundidade
depthFirstSearch()
para todos os vértices
edges = vazio
i=0
enquanto existe vértice tal que
;
retornar edges;
; Execução
para todos os vértices adjacentes a a b c d e f g h i
se
num 1 0 0 0 2 0 0 0 0
anexe a aresta a edges
i=2
edges
95
Busca em Grafos – Busca em Profundidade
depthFirstSearch()
para todos os vértices
edges = vazio
i=0
enquanto existe vértice tal que
;
retornar edges;
; Execução
para todos os vértices adjacentes a a b c d e f g h i
se
num 1 0 0 0 2 0 0 0 0
anexe a aresta a edges
i=2
edges
96
Busca em Grafos – Busca em Profundidade
depthFirstSearch()
para todos os vértices
edges = vazio
i=0
enquanto existe vértice tal que
;
retornar edges;
; Execução
para todos os vértices adjacentes a a b c d e f g h i
se
num 1 0 0 0 2 3 0 0 0
anexe a aresta a edges
i=3
edges
97
Busca em Grafos – Busca em Profundidade
depthFirstSearch()
para todos os vértices
edges = vazio
i=0
enquanto existe vértice tal que
;
retornar edges;
; Execução
para todos os vértices adjacentes a a b c d e f g h i
se
num 1 0 0 0 2 3 0 0 0
anexe a aresta a edges
i=3
edges
98
Busca em Grafos – Busca em Profundidade
depthFirstSearch()
para todos os vértices
edges = vazio
i=0
enquanto existe vértice tal que
;
retornar edges;
; Execução
para todos os vértices adjacentes a
a b c d e f g h i
se
anexe a aresta a edges num 1 0 0 0 2 3 0 0 4
i=4
edges
99
Busca em Grafos – Busca em Profundidade
Resultado da Execução
a b c d e f g h i
num 1 6 7 9 2 3 5 8 4
i=9
edges
102
Busca em Grafos – Busca Irrestrita
Processo sistemático de se percorrer um grafo G de tal
modo que cada aresta seja visitada um número finito de
vezes (qualquer) de vezes
retirar de
desmarcar
Desmarcar todos os vértices
Definir uma pilha
Escolher uma raiz
103
Busca em Grafos – Busca Irrestrita
Busca irrestrita em profundidade em um grafo G, constrói uma árvore T,
enraizada e rotulada, denominada árvore irrestrita de profundidade
• O rótulo da raiz de T é o vértice da raiz de busca
• Cada chamada recursiva , dentro do procedimento do algoritmo,
corresponde em T a uma aresta , sendo o pai de , com rótulo e rótulo
104
Busca em Grafos – Caminhos mais curtos
Às arestas são atribuídos pesos
• Distâncias entre cidades
• Tempos que separam a execução de certas tarefas
• Custos para transmitir informações entre localidades
distintas
Algoritmo de Dijkstra
• Escolhe-se o menor caminho a partir de um vértice
• Cada vértice é tentado uma única vez
– Todos os caminhos que saem dele são abertos e o
próprio vértice é colocado à parte e não é mais usado
• Depois que todos os vértices são visitados, o algoritmo é
terminado
105
Busca em Grafos – Caminhos mais curtos
Dijkstra()
= todos os vértices
para todos os vértices
//iniciar com valor grande
enquanto
vértice em com mínimo
remove de
para todos os vértices adjacentes a e em toBeChecked
se
ativo
a
b
c
d 0
e
f
g
h
i 106
j
Busca em Grafos – Caminhos mais curtos
Dijkstra()
= todos os vértices
para todos os vértices
//iniciar com valor grande
enquanto
vértice em com mínimo
remove de
para todos os vértices adjacentes a e em toBeChecked
se
ativo
d
a
b
c
d 0
e
f
g
h
i 107
j
Busca em Grafos – Caminhos mais curtos
Dijkstra()
= todos os vértices
para todos os vértices
//iniciar com valor grande
enquanto
vértice em com mínimo
remove de
para todos os vértices adjacentes a e em toBeChecked
se
ativo
d
a 4
b
c
d 0
e
f
g
h 1
i 108
j
Busca em Grafos – Caminhos mais curtos
Dijkstra()
= todos os vértices
para todos os vértices
//iniciar com valor grande
enquanto
vértice em com mínimo
remove de
para todos os vértices adjacentes a e em toBeChecked
se
ativo
d h
a 4
b
c
d 0
e
f
g
h 1
i 109
j
Busca em Grafos – Caminhos mais curtos
Dijkstra()
= todos os vértices
para todos os vértices
//iniciar com valor grande
enquanto
vértice em com mínimo
remove de
para todos os vértices adjacentes a e em toBeChecked
se
ativo
d h
a 4 4
b
c
d 0
e 6
f
g
h 1
i 10 110
j
Busca em Grafos – Caminhos mais curtos
Dijkstra()
= todos os vértices
para todos os vértices
//iniciar com valor grande
enquanto
vértice em com mínimo
remove de
para todos os vértices adjacentes a e em toBeChecked
se
ativo
d h a
a 4 4
b
c
d 0
e 6
f
g
h 1
i 10 111
j
Busca em Grafos – Caminhos mais curtos
Dijkstra()
= todos os vértices
para todos os vértices
//iniciar com valor grande
enquanto
vértice em com mínimo
remove de
para todos os vértices adjacentes a e em toBeChecked
se
ativo
d h a
a 4 4
b
c
d 0
e 6 5
f
g
h 1
i 10 10 112
j
Busca em Grafos – Caminhos mais curtos
Resultado da execução
ativo
d h a e f b i c j g
a 4 4
b 9
c 11 11 11
d 0
e 6 5
f 8
g 15 15 15 15 12
h 1
i 10 10 10 9 9
j 11 11 113
Busca em Grafos – Problema do caminho mais
curto de todos para todos
Encontrar todos os menores caminhos a partir de um
vértice para qualquer outro
• Método concebido por Robert W. Floyd e P. Z.
Ingerman
114
Busca em Grafos – Problema do caminho mais
curto de todos para todos
WFI()
para até
para até
para até
se
a b c d e
a 0 2 -4
b 0 -2 1 3
c 0 1
d 0 4
e 0
115
Busca em Grafos – Problema do caminho mais
curto de todos para todos
a b c d e
a 0 2 -4
b 0 -2 1 3
c 0 1
d 0 4
e 0
Testes:
a→b = 2
116
Busca em Grafos – Problema do caminho mais
curto de todos para todos
a b c d e
a 0 2 -4
b 0 -2 1 3
c 0 1
d 0 4
e 0
Testes:
117
Busca em Grafos – Problema do caminho mais
curto de todos para todos
a b c d e
a 0 2 -4
b 0 -2 1 3
c 0 1
d 0 4
e 0
Testes:
118
Busca em Grafos – Problema do caminho mais
curto de todos para todos
a b c d e
a 0 2 -4
b 0 -2 1 3
c 0 1
d 0 4
e 0
Testes:
119
Busca em Grafos – Problema do caminho mais
curto de todos para todos
a b c d e
a 0 2 -4
b 0 -2 1 3
c 0 1
d 0 4
e 0
Testes:
120
Busca em Grafos – Problema do caminho mais
curto de todos para todos
a b c d e
a 0 2 -4
b 0 -2 1 3
c 0 1
d 0 4
e 0
Testes:
121
Busca em Grafos – Problema do caminho mais
curto de todos para todos
a b c d e
a 0 2 -4
b 0 -2 1 3
c 0 1
d 0 4
e 0
Testes:
122
Busca em Grafos – Problema do caminho mais
curto de todos para todos
a b c d e
a 0 2 -4
b 0 -2 1 3
c 0 1
d 0 4
e 0
Testes:
123
Busca em Grafos – Problema do caminho mais
curto de todos para todos
a b c d e
a 0 2 -4
b 0 -2 1 3
c 0 1
d 0 4
e 0
Testes:
124
Busca em Grafos – Problema do caminho mais
curto de todos para todos
a b c d e
a 0 2 -4
b 0 -2 1 3 Testes finais:
c 0 1
a→b = 2 √ nenhuma outra aresta chegando em b
d 0 4 a→c = ∞ a→b→c = 0 √
a→d = -4 √ a→b→d = 3
e 0 a→e = ∞ a→b→e = 5
a→b→c→e = 1
a→b→d→e = 7
a→d→e = 0 √
b→c = -2 √ nenhuma outra aresta chegando em c
b→d = 1 √
b→e = 3 b→c→e = -1 √
b→d→e = 5 √
c→e = 1 √ única aresta saindo de c
d→e = 4 √ única aresta saindo de d
e não possui arestas saindo
125
Algoritmo Guloso
Seja dado um conjunto deseja-se determiner um subconjunto tal que:
• satisfaz uma dada propriedade , e
• é máximo/mínimo/livre em relação a algum critério dado
Procedimento iterativo de inserção de um elemento por vez ao conjunto até que se alcance o
total de elementos do conjunto
Pontos máximos em 2D. Um ponto máximo em uma coleção
não é dominado por nenhum outro da coleção
Diz-se que um ponto domina um ponto se e
proc maximos (Inteiro n, Ponto p [1..n]) {
para i desde 1 até n fazer {
dominado ¬ falso
j ¬ 1
enquanto Ødominado Ù j£n fazer {
se i¹j Ù domina (p[j],p[i]) então
dominado ¬ verdadeiro
j ¬ j + 1
}
se Ødominado então reportar (p[i])
}
}
126
Árvore Geradora Máxima e Mínima
Seja um grafo um grafo conexo, em que cada aresta possui um peso .
• O objetivo é se construir uma árvore a partir de que contenha um
somatório de pesos das arestas de tal forma que seja o máximo ou o
mínimo
– Algoritmo Guloso/PRIM: construção de uma árvore mínima ou
máxima a partir de uma aresta inicial
» Incorporação de ao conjunto de arestas que não produza ciclos,
dentre todas arestas possíveis de serem visitadas (conectadas às
arestas já existentes em )
» O peso total de é máximo ou mínimo dentre todas as escolhas
possíveis que satisfazem a condição anterior
– Algoritmo de KRUSKAL: construção de uma árvore mínima ou
máxima por meio de uma floresta
» Incorporação de ao conjunto de arestas que não produza ciclos,
dentre todas arestas possíveis de serem visitadas
» O peso total de é máximo ou mínimo dentre todas as escolhas
possíveis que satisfazem a condição anterior
127
Detecção de ciclos
Obtido a partir do percurso DFS – busca em profundidade
Algoritmo para grafos não-direcionados
cycleDetectionDFS(v)
128
Grafos Eulerianos
Trilha euleriana em um grafo é um caminho que inclui todas
as arestas do grafo somente uma vez
Ciclo euleriano é uma trilha euleriana fechada, isto é, que
parte e termina no mesmo vértice
Nome derivado de Euler que primeiro identificou caminhos
desta forma e deu início ao estudo de campo Grafos
O teorema provado por Euler mostrou que um grafo é
euleriano se cada vértice do grafo é incidente em um número
par de arestas
Euler mostrou também que um grafo contém uma trilha
euleriana se ele tem exatamente dois vértices incidente em
um número ímpar de arestas
Qualquer outra situação não produzirá um caminho euleriano
129
Grafos Eulerianos
A Fleury é atribuído o mais velho algoritmo usado para encontrar um ciclo euleriano
Neste procedimento toma-se cuidado para não cruzar uma ponte, isto é, uma aresta
cuja remoção desconectaria os grafos e já que, se o cruzamento de não fosse
concluído antes de cruzar tal aresta para passer para , não seria possível retornar para
.
• Portanto, somente depois de percorrido todo subgrafo é que pode o caminho
passar por um aresta dessas
FleuryAlgorithm()
um vértice qualquer de início
remova de
senão
em que não é uma ponte em
131
Grafos Eulerianos
Escolhe-se um vértice de início (b)
Caminho: b – e
132
Grafos Eulerianos
Escolhe-se um vértice de início (b)
Caminho: b – e – f
133
Grafos Eulerianos
Escolhe-se um vértice de início (b)
Caminho: b – e – f – b
134
Grafos Eulerianos
Escolhe-se um vértice de início (b)
Caminho: b – e – f – b – c
135
Grafos Eulerianos
Escolhe-se um vértice de início (b)
Caminho: b – e – f – b – c – a
136
Grafos Eulerianos
Escolhe-se um vértice de início (b)
Caminho: b – e – f – b – c – a
Dúvida
• Qual aresta não cruzada é escolhida no vértice
– ?
– Antes da escolha de uma aresta, um teste deve ser feito para
determinar se a aresta é uma ponte no subgrafo não percorrido
137
Grafos Eulerianos
Se escolher a , as três arestas remanescentes não cruzadas
ficam inatingíveis, já que a é uma ponte
• Desconecta dois subgrafos
138
Grafos Eulerianos
Escolhe-se um vértice de início (b)
Caminho: b – e – f – b – c – a – d
139
Grafos Eulerianos
Escolhe-se um vértice de início (b)
Caminho: b – e – f – b – c – a – d – e
140
Grafos Eulerianos
Escolhe-se um vértice de início (b)
Caminho: b – e – f – b – c – a – d – e – a
141
Grafos Eulerianos
Escolhe-se um vértice de início (b)
Caminho: b – e – f – b – c – a – d – e – a – b
142
Grafos Eulerianos
Escolhe-se um vértice de início (b)
Caminho: b – e – f – b – c – a – d – e – a – b
143
Grafos Hamiltonianos
Ciclo Hamiltoniano em um grafo é um ciclo que passa
através de todos os vértices do grafo, sem repeti-los,
terminando o ciclo no vértice inicial
Logo, todos os grafos completos são hamiltonianos
Algoritmo
• Expande um grafo a um grafo com mais arestas, e então
manipula este ciclo adicionando algumas arestas e
removendo outras, de modo que seja formado um ciclo
hamiltoniano com as arestas que pertencem ao grafo
original
144
Grafos Hamiltonianos
Passo 1
• Dois vértices não adjacentes são conectados com uma
aresta se o número total de seus vizinhos não é menor
do que o número de todos os vértices no grafo
145
Grafos Hamiltonianos
Passo 1
• Dois vértices não adjacentes são conectados com uma
aresta se o número total de seus vizinhos não é menor
do que o número de todos os vértices no grafo
146
Grafos Hamiltonianos
Passo 1
• Dois vértices não adjacentes são conectados com uma
aresta se o número total de seus vizinhos não é menor
do que o número de todos os vértices no grafo
147
Grafos Hamiltonianos
Passo 1
• Dois vértices não adjacentes são conectados com uma
aresta se o número total de seus vizinhos não é menor
do que o número de todos os vértices no grafo
148
Grafos Hamiltonianos
Passo 1
• Dois vértices não adjacentes são conectados com uma
aresta se o número total de seus vizinhos não é menor
do que o número de todos os vértices no grafo
149
Grafos Hamiltonianos
Passo 1
• Dois vértices não adjacentes são conectados com uma
aresta se o número total de seus vizinhos não é menor
do que o número de todos os vértices no grafo
150
Grafos Hamiltonianos
Passo 1
• Dois vértices não adjacentes são conectados com uma
aresta se o número total de seus vizinhos não é menor
do que o número de todos os vértices no grafo
151
Grafos Hamiltonianos
Passo 2
• Um ciclo hamiltoniano é encontrado e é encontrada a
aresta com mais alto rótulo
152
Grafos Hamiltonianos
Passo 3
• Movendo à esquerda da aresta com mais alto rótulo,
verificar as arestas dos próximos dois vértices vizinhos
de modo que as arestas se cruzem
153
Grafos Hamiltonianos
Passo 3
• Vértices e b: e – par rejeitado devido rótulo da ser
maior que rótulo do ciclo corrente
154
Grafos Hamiltonianos
Passo 3
• Vértices e : e – arestas aceitas (rótulos 0 e 5)
155
Grafos Hamiltonianos
156
Grafos Hamiltonianos
157
Árvore Geradora Máxima e Mínima
Exemplo de árvore geradora máxima por floresta
eliminar
158
Árvore Geradora Máxima e Mínima
Kruskal
• Expandir um conjunto de árvores para formar uma árvore de espalhamento
– Todas as arestas são ordenadas pelo peso
– Cada aresta é verificada para ver se é parte da árvore em construção (não aparece ciclo com sua inclusão)
Jarník-Prim
• Criar a expandir somente uma árvore adicionando novos ramos a ela
– Todas as arestas são ordenadas pelo peso
– Candidata à inclusão na árvore é a aresta que não leva aos ciclos e é incidente a um vértice já na árvore
Kruskal x Prim
• Prim sempre mantém a árvore em construção reunida, sendo uma árvore em todos os estágios da aplicação do
algoritmo
• Kruskal considera cada aresta apenas uma vez; logo, é mais rápido
Prim()
Kruskal()
edges = sequência de todas as arestas do grafo
edges = sequência de todas as arestas do grafo ordenadas pelo peso
ordenadas pelo peso para até
para e para até
se de edges não forma um ciclo com as arestas em se de edges não forma ciclo com as arestas em e é
adicione a incidente a um vértice em
adicione a
break
159
Árvore Geradora Máxima e Mínima - Kruskal
160
Árvore Geradora Máxima e Mínima - Kruskal
161
Árvore Geradora Máxima e Mínima - PRIM
162
Ordenamento Topológico
As dependências entre as tarefas podem ser mostradas na forma de um dígrafo
A ordenação topológica lineariza um dígrafo
• Rotula todos os vértices com números , de modo que somente se há um
caminho do vértice para o vértice
• O dígrafo não pode incluir um ciclo – caso contrário, uma ordenação
topológica é impossível
Aplicação: encontrar, diante de um conjunto de tarefas a serem realizadas, qual
tarefa é realizada primeiro
Algoritmo
• Encontrar um vértice que não tenha nenhuma aresta saindo, chamado de
escoadouro ou vértice mínimo, e então desprezar todas as arestas que levem
de qualquer vértice a
topologicasSort()
para até
encontre um vértice mínimo
171
Grafos – Redes – Fluxos Máximos
Exemplo: dado que os números mostrados representam as
máximas capacidades, tem a capacidade de 5 unidades,
mas tem capacidade de 4 unidades
172
Grafos – Redes – Fluxos Máximos
Algoritmo de Ford-Fulkerson
• Problema de fluxo máximo:
– Aumentar o fluxo de modo que a soma onde não é
fonte nem o escoadouro
• Conceito de corte:
– Um corte separando de é um conjunto de arestas
entre os vertices do conjunto e os vertices do
conjunto
» Qualquer vértice do grafo pertence a um desses
conjuntos, e a fonte está em e o escoadouro em
173
Grafos – Redes – Fluxos Máximos
Exemplo
• Se , então e o corte é o conjunto de arestas
• Portanto, se todas as arestas pertencentes a este
conjunto são cortes, não há meios de ir de para
• Capacidade de corte:
174
Grafos – Redes – Fluxo Máximo Mínimo Corte
Em qualquer rede, o fluxo máximo de para é igual à capacidade
mínima de qualquer corte
Encontrar um corte que tenha a menor capacidade entre todos os
cortes possíveis e transferir, através de cada aresta deste corte, tantas
unidades quanto a capacidade permitir
Logo, embora possa haver cortes com grande capacidade, o corte com
a menor capacidade determina o fluxo da rede
Casamento
• Um grafo bipartido com um conjunto de vértices dividido em dois
subconjuntos e tais que, para cada aresta se o vértice está em um
dos conjuntos ou , então está no outro conjunto
• Exemplo
– Existem 5 oportunidades de emprego (a, b, c, d, e) e 5
candidatos (p, q, r, s, t) com as seguintes qualificações
Candidatos p q r s t
Qualificações abc bd ae e cde 175
Grafos – Redes – Casamento
Candidatos p q r s t
Qualificações abc bd ae e cde
Problemas
• Pode não existir candidatos suficientes
• Pode não haver meio de atribuir um candidato para cada oportunidade,
mesmo se o número de candidatos exceder o número de oportunidades
Atribuir candidatos a tantos trabalhos possíveis
176
Grafos – Redes – Casamento
Um casamento em um grafo é um subconjunto de arestas, tal que duas arestas não
partilham o mesmo vértice, ou seja, não há duas areastas adjacentes
Casamento máximo é o que contém um número máximo de arestas, de modo que o
número de vértices não casados seja mínimo
Casamento perfeito (problema de enlace) é o que casa todos os vértices do grafo
Exemplo 1
• Os conjuntos e estão casados
177
Exemplo 1 Exemplo 2
Tratabilidade de Problemas
Um algoritmo é eficiente precisamente quando a sua complexidade for
um polinômio no tamanho de sua entrada
• Classe P: algoritmos eficientes cuja complexidade é uma função polinomial nos
tamanhos dos dados de entrada.
• Classe NP: compreende todos os problemas de ordem P, tais que existe uma
justificativa à resposta SIM para P, cujo passo de reconhecimento pode ser realizado
por um algoritmo polinomial do tamanho da entrada de P.
• Classe NP-Completo: é o tipo do problema que não possui uma representação
polinomial de seus dados de entrada, nem a partir da admissão de um resultado
satisfatório.
Problemas de decisão
• Clique em um grafo
• Caixeiro viajante para um Grafo G e um inteiro
– Verificar se G possui um percurso de caixeiro viajante de peso
– Localizar se G possui um percurso de caixeiro viajante de peso
– Localizar se G possui um percurso de caixeiro viajante ótimo
178
Classe P de Problemas
Para um problema de decisão o tamanho da saída é constante,
podendo ignorá-lo
• T (n) O (1) : constante – mais rápido, impossível
• T (n) O (log log n) : super-rápido
• T (n) O (log n) : logarítmico – muito bom
• T (n) O (n) : linear – é o melhor que se pode esperar se
algo não pode ser determinado sem examinar toda a entrada
• T (n) O (n log n) : limite de muitos problemas práticos,
ex.: ordenar uma coleção de números
• T (n) O (n2) : quadrático
• T (n) O (nk) : polinomial – ok para n pequeno
• T (n) O (kn), O (n!), O (nn) : exponencial – evite!
179
Problemas Aparentemente Difíceis - NPC
Satisfabilidade
• Uma expressão Booleana na
• é satisfatível?
Conjunto independente de vértices
• Um grafo G e um inteiro
• G possui um conjunto independente de vértices de tamanho
Clique
• Um grafo G e um inteiro
• G possui uma clique de tamanho
Cobertura de vértices
• Um grafo G e um inteiro
• G possui uma cobertura de vértices de tamanho
Ciclo hamiltoniano direcionado e não direcionado
• Dígrafo D
• D possui ciclo hamiltoniano?
Coloração
• Um grafo G e um inteiro
• G possui uma coloração com um número de cores?
180