Você está na página 1de 180

Teoria dos Grafos

Prof. Ms. Max Robert Marinho


Universidade do Estado de Mato Grosso – UNEMAT
Alto Araguaia

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

 O interior do laço mais externo tem complexidade

 O algoritmo 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

 Usar limites aproximados

 Aproximar por integrais

15
Resolvendo somatórios por indução
 Formula-se um palpite e tenta-se prová-lo. Ex.:

 Prova do caso base:


• Para n = 0, o somatório é 0
• Trivialmente verdadeiro se admitirmos d = 0
 Prova do caso genérico

16
Resolvendo somatórios por indução
 Prova do caso genérico:
• Coeficientes de potências iguais têm “bater”

• Resolvendo temos a = 1/3, b = 1/2 e c = 1/6

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:

 Para resolver tais problemas, pode-se empregar muitas


técnicas. Vamos ver apenas algumas:
• “Chute” + verificação por indução
• Iteração

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

 Vamos provar por indução que, para n = 1 ou qualquer


valor par de n maior que 1, T(n) = (n log2 n) + n
26
Provando o Palpite por Indução
 Caso base: n = 1
• T(1) = (1 log2 1) + 1 = 0 + 1 = 1
 Caso geral: como n é uma potência de 2, n/2 também é e
podemos admitir que a hipótese é verdadeira para qualquer
potência de 2 n’ < n
• T(n) = 2 T (n / 2) + n
= 2 ((n / 2) log2 (n /2) + n / 2) + n
= (n log2 (n / 2) + n) + n
= n log2 (n / 2) + 2n
= n (log2 n – log2 2) + 2n
= n (log2 n – 1) + 2n
= n log2 n + n

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

 Lembramos que, no limite, temos que chegar no caso base


da recursão, ou seja, T(1)
 Para termos a fórmula acima em termos de T(1), n / (2k)
tem que convergir para 1, e isso só acontece se 2k=1, ou
seja, k=log2n

29
Resolvendo o MergeSort por Iteração
 Temos então

 Chegamos à mesma fórmula, mas agora sem “chutar”


 Lembre-se dessas úteis relações envolvendo logaritmos:

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

 Lembrando a fórmula para a soma de termos de uma PG:

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

 Outro exemplo: considere a recorrência dada por

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) +

(n/4)2 (n/4)2 (n/4)2 9(n/4)2=n2(3/4)2


+
T(1) …
1 1 1 1 1 … n2(3/4)k

37
Árvore de Recursão – Outro exemplo
 Vemos que a soma das complexidades locais pelos k+1
níveis da recursão nos dá

 Na verdade, a complexidade assintótica do algoritmo já


pode ser estabelecida aqui como sendo (n2) uma vez que
sabemos que o somatório acima converge para uma
constante finita mesmo que k tenda a infinito
 Se quisermos uma fórmula mais exata, podemos observar
(pelo mesmo raciocínio usado na recursão do MergeSort)
que k=log2n. Aplicando a fórmula da soma de termos de
uma PG obtemos

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

 São inúmeros os problemas práticos que podem ser


resolvidos mediante uma modelagem em grafos e posterior
utilização de um programa em computador

 A eficiência de tempo e espaço de um processo são fatores


básicos para a sua avaliação

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).

 Vê-se um grafo com laços e um multigrafo


• Multigrafo é aquele onde entre um par de vértices
existem mais de uma aresta, sendo estas denominadas
arestas paralelas
49
Grafos
 Em um grafo G(V,E) define-se grau de um vértice v є V, denotado por
grau(v), como sendo o número de vértices adjacentes a v.
• Um vértice que possui grau zero é chamado isolado
 Uma sequência de vértices tal que , , é denominado caminho de v1 a vk
• Um caminho é formado por k-1 arestas, sendo este valor o
comprimento do caminho.
• Se todos os vértices do caminho v1,...,vk forem distintos, a
sequência se chama caminho simples
• Se as arestas forem distintas a sequência denomina-se trajeto
• Um ciclo é um caminho v1,...,vk, vk+1 sendo v1=vk+1 e k≥3
• Um grafo que não possui ciclo chama-se acíclico
• Um caminho que contenha cada vértice do grafo exatamente uma
vez é chamado hamiltoniano
• Um caminho, ou ciclo, que contenha cada aresta do grafo somente
uma vez é chamado euleriano

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

 Denomina-se distância d(v,w) entre dois vértices v,w de


um grafo ao comprimento de menor caminho entre v e w.
51
Grafos
 Seja G(V,E) um grafo, e є E uma aresta. Denota-se por G-e o grafo
obtido de G, pela exclusão da aresta e.
 Se v, w é um par de vértices não adjacentes em G, a notação
representa o grafo obtido adicionando-se a G a aresta (v,w).

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

• Abaixo ve-se um grafo e seu complemento

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

 A raiz de uma árvore não possui pai


 Uma folha é um vértice sem filhos
 Nível de um vértice v é o seu comprimento até sua raiz
 Altura de uma árvore é o valor máximo de nível, para todo
vértice v de T
 Uma árvore estritamente m-ária é uma árvore enraizada
em que cada vértice não folha possui exatamente m filhos,
m≥1
• Quando m=2 a árvore é estritamente binária

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

 Subdivisão de arestas: G2 é uma subdivisão de G1, quando


G2 puder ser obtido de G1 através de uma sequência se
subdivisões de arestas de G1

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

Matriz de adjacência dos vértices {1,2,3,4,5,6}

Matriz de adjacência dos vértices {5,4,1,3,2,6}


77
Grafos – Representação Computacional
 Uma matriz de adjacência para um dígrafo segue a mesma
regra comum
 quando a aresta for divergente de e convergente a
 quando for ao contrário
 Espaço de armazenamento
 Capacidade de armazenar 2 tipos de informação em uma
mesma matriz dependendo da forma de construção da
matriz de adjacência

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

– Matriz de incidência para o conjunto de arestas


E={(1,2),(1,3),(1,6),(1,5),(2,3),(2,6),(3,5),(3,6),
(5,4),(5,6),(4,6),(3,4)}

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

dados grafo G(V,E)


ordenar V em ordem não crescente de graus

colorir com a cor 1 (incluir em )


para efetuar

colorir com a cor (incluir em )


81
Grafos – Coloração
 Algoritmo otimizado

dados grafo G(V,E)


ordenar V em ordem não crescente de graus
para efetuar
para efetuar
para efetuar
se já colorido então

enquanto não colorido efetuar


se então cor
caso contrário

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

dados G(V,E), conexo


Procedimento
marcar
colocar na pilha
para efetuar
se é não marcado então
visitar ----- I

caso contrário
se e não são consecutivos em
então visitar ----- II
retirar de

Desmarcar todos os vértices


Definir uma pilha
Escolher uma raiz
86
Busca em Grafos – Busca em Profundidade

 Apresentam-se em (b) e (c)


duas formas de busca em
profundidade para o grafo
(a)

 As arestas desenhadas por


linhas retas correspondem às
arestas da árvore geradora

 As arestas curvas
representam as frondes

87
Busca em Grafos – Busca em Profundidade
 Aplicação em dígrafos
 A pilha pode ser ignorada

dados G(V,E), conexo


Procedimento
marcar
colocar na pilha
para efetuar
visitar
se é não marcado então
retirar de

Desmarcar todos os vértices


Definir uma pilha
Escolher uma raiz

88
Busca em Grafos – Busca em Profundidade

Lista de adjacência PE(v) e PS(v) como profundidade de entrada e saída de v


na pilha Q (inclusão e exclusão

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

 O algoritmo garante gerar uma árvore, ou um conjunto de árvores que inclui ou


se espalha sobre todos os vértices do grafo original – árvore de espalhamento
 As arestas incluídas nesta árvore são chamadas de arestas de frente e as arestas
não incluídas são as arestas de trás 100
Busca em Grafos – Busca em Largura
 O critério deve obedecer certas características
• Dentre todos os vértices marcados e incidentes a alguma aresta
ainda não explorada, escolher aqueles menos recentemente
alcançados na busca
• O conjunto de arestas em III é uma árvore geradora

dados G(V,E), conexo


desmarcar todos os vértices
escolher uma raiz
definir uma fila , vazia
marcar s
inserir s em
enquanto efetuar
seja o primeiro elemento de
para efetuar
se não é marcado então
visitar ----- III
marcar
inserir em
caso contrário
se então visitar ----- IV
retirar de 101
Busca em Grafos – Busca em Largura

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

dados G(V,E), conexo


Procedimento
marcar
Colocar na pilha
para efetuar
se então
visitar

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

 A matriz de adjacências deve ser fornecida indicando todos


os pesos das arestas do grafo (ou dígrafo)

 Diferentemente do algoritmo de Dijkstra, o grafo pode


incluir pesos negativos

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:

a→b = 2 nenhuma aresta chegando em b

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:

a→b = 2 nenhuma outra aresta chegando em b


a→c = ∞

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:

a→b = 2 nenhuma outra aresta chegando em b


a→c = ∞ a→b→c = 0

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:

a→b = 2 √ nenhuma outra aresta chegando em b


a→c = ∞ a→b→c = 0 √

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:

a→b = 2 √ nenhuma outra aresta chegando em b


a→c = ∞ a→b→c = 0 √
a→d = -4

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:

a→b = 2 √ nenhuma outra aresta chegando em b


a→c = ∞ a→b→c = 0 √
a→d = -4 a→b→d = 3

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:

a→b = 2 √ nenhuma outra aresta chegando em b


a→c = ∞ a→b→c = 0 √
a→d = -4 √ a→b→d = 3

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:

a→b = 2 √ nenhuma outra aresta chegando em b


a→c = ∞ a→b→c = 0 √
a→d = -4 √ a→b→d = 3
a→e = ∞ a→b→e = 5
a→b→c→e = 1
a→b→d→e = 7
a→d→e = 0 √

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)

para todos os vértices u adjacentes a v


se DFS
anexe a aresta a edges
cycleDetectionDFS(u)
senão
se aresta não está em edges
ciclo detectado

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

enquanto tem arestas não cruzadas


se é a única aresta não cruzada

remova de
senão
em que não é uma ponte em

se não tem arestas


sucesso
senão
falha 130
Grafos Eulerianos
 Escolhe-se um vértice de início (b)

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

dados G(V,E), conexo, V={1,..,n}


Definir conjuntos e
Seja as arestas de G, ordenadas segundo pesos não
crescentes
Para efetuar
seja o par de vértices extremos de
se pertencem respectivamente a conjuntos ,
disjuntos então

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

remova do dígrafo o vértice e todas as arestas incidentes em


163
Ordenamento Topológico

Sequência resultante: 164


Ordenamento Topológico

Sequência resultante: g 165


Ordenamento Topológico

Sequência resultante: g – e 166


Ordenamento Topológico

Sequência resultante: g – e – b 167


Ordenamento Topológico

Sequência resultante: g – e – b – f 168


Ordenamento Topológico

Sequência resultante: g – e – b – f – d 169


Ordenamento Topológico

Sequência resultante: g – e – b – f – d – c – a 170


Grafos - Redes
 Rede é um dígrafo com um vértice chamado de fonte, sem
arestas que chegam, e um vértice , chamado de escoadouro,
sem arestas que saem
 Para cada aresta , é associado um número , chamado de
capacidade da aresta
 Um fluxo é uma função que atribui um número a cada aresta
da rede e satisfaz duas condições
• O fluxo através de uma aresta não pode ser maior do que
sua capacidade, ou expressão (restrição de capacidade)
• O fluxo total que chega a um vértice é o mesmo que o
fluxo total que sai dele, onde não é fonte nem o
escoadouro (convservação de fluxo)

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

• Porém, apenas é um casamento máximo


• Não há casamento perfeito neste grafo
 Exemplo 2
• é um casamento perfeito

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

Você também pode gostar