Escolar Documentos
Profissional Documentos
Cultura Documentos
Aula 3
Algoritmos de Busca em Grafos
<1,2,5,3,4> é um caminho de 1 a 4
2 5
4
Definições
A distância entre s a t é o comprimento do
caminho mínimo entre os dois vértices
7
A distância entre 4 e 5 é 2
2 5
A distância entre 4 e 7 é 3
1 3 6
A distância entre 4 e 1 é 1
4 8 A distância entre 4 e 8 é?
Definições
Dizemos que um vértice t é alcançável a partir de
um vértice s, se existe um caminho de s a t
Se t não é alcançável a partir de s, então dizemos
que a distância ente esses vértices é infinita
7
2 5
A distância entre 4 e 8 é infinita
1 3 6
4 8
O diâmetro é definido como a maior distância entre os possíveis pares (alcançáveis) de vértices
Definições
Grafo completo:
• É um grafo no qual dois vértices distintos
quaisquer são adjacentes
Um grafo completo de ordem = n tem o
tamanho = n(n-1)/2
Definições
O grau de um vértice, d(xi), é o número de
extremidades de arestas naquele vértice
7 Vértices Grau
1 3
2 5
2 3
3 5
1 3 6
4 2
5 2
4
6 1
7 0
Definições
O grau de entrada (in-degree), d-(xi), é o número
de arestas direcionadas que “entram” no vértice
O grau de saída (out-degree), d+(xi), é o número
de arestas direcionadas que “saem” do vértice
4 6 6 1 2
7 0 0
Definições
Um caso especial é um laço, que
acrescenta dois para o grau em um grafo
não-direcionado
um vértice com um laço "vê" a si mesmo como um vértice
adjacente de ambas as extremidades da aresta, assim, se
soma dois e não um, para o grau
2 5 2 5
1 3 6 1 3
4
Subgrafo
7 3
2
2 5 8 6
1 5
1 3 6
8
4 7
4
http://webspace.ship.edu/deensley/discretemath/flash/ch7/sec7_3/planargraphs.html
Definições
L. Euler descobriu que um grafo planar divide o plano
em um determinado número de regiões
• O–T+R=2
• R = 2 – O +T
O = ordem do grafo
T = tamanho do grafo
R = 2 – 8 + 12 = 6 R=2–4+6=4
Exercício
R = 2 – 13 + 19 = 8
Resposta do Exercício
R = 2 – 13 + 19 = 8
Definições
Problema: Colorir um mapa sem
que regiões com fronteiras
comuns tivessem a mesma cor
• Matriz de Adjacência
• Matriz de Incidência
• Lista de Adjacência
Matriz de Adjacência
A B C A B C D E F G H
A 0 1 0 0 0 0 1 0
E B 1 0 1 0 0 0 0 0
G D
C 0 1 0 1 0 0 0 0
H F D 0 0 1 0 1 0 0 0
E 0 0 0 1 0 1 1 0
F 0 0 0 0 1 0 0 0
G 1 0 0 0 1 0 0 1
Somando os valores de cada
H 0 0 0 0 0 0 1 0
linha temos o grau do nó
correspondente!
Exemplo
B A B C D E F G H
A C
A 0 1 0 0 0 0 1 0
E B 0 0 1 0 0 0 0 0
G D C 0 0 0 0 0 0 0 0
H F D 0 0 1 0 0 0 0 0
E 0 0 0 1 0 1 1 0
Somando os valores de cada F 0 0 0 0 1 0 0 0
coluna temos o grau de
G 0 0 0 0 0 0 0 1
entrada!
H 0 0 0 0 0 0 0 0
Somando os valores de cada
linha temos o grau de saída!
O grau total é a soma dos
dois valores!
Matriz de Incidência
• A Matriz de Incidência representa computacionalmente
um grafo em que as linhas representam os vértices, e as
colunas, as arestas
• Assim, dado um grafo com n vértices e m arestas,
podemos representá-lo por uma matriz B n x m,
guardando informações sobre a incidência de vértices
em cada aresta
• Para representar um grafo sem pesos nas arestas e
orientado, basta que as entradas da matriz B contenham
+1 se a aresta chega no vértice, -1 se a aresta parte do
vértice, e 0 caso a aresta não chegue nem parta no/do
vértice
Exemplo
Exemplo
e1 e2 e3 e4
1 1 1 0 1
1 0 0 0 2
B(i,j) = 0 1 0 1 3
0 0 1 1 4
Adj[1] = {2}
Adj[2] = {1,3,5}
Adj[3] = {4}
Adj[4] = {1,5}
Adj[5] = {2}
A 0 2 0 0 0 0 3 0
A B 2 C B 2 0 2 0 0 0 0 0
2
4
3 C 0 2 0 4 0 0 0 0
3
E
G
2 D D 0 0 4 0 2 0 0 0
1 2
H F E 0 0 0 2 0 2 3 0
F 0 0 0 0 2 0 0 0
G 3 0 0 0 3 0 0 1
H 0 0 0 0 0 0 1 0
Exemplo
Lista de Adjacência
Complexidade de Espaço
Inicialmente {s}
Os níveis são explorados “geologicamente”
Fronteira = nível atual
Iterativamente avançar a fronteira para o nível
seguinte, cuidando para não voltar ao nível inferior
Busca em Largura
Inicialmente {s}
Os níveis são explorados “geologicamente”
Fronteira = nível atual
Iterativamente avançar a fronteira para o nível
seguinte, cuidando para não voltar ao nível inferior
Busca em Largura
Inicialmente {s}
Os níveis são explorados “geologicamente”
Fronteira = nível atual
Iterativamente avançar a fronteira para o nível
seguinte, cuidando para não voltar ao nível inferior
Busca em Largura
Inicialmente {s}
Os níveis são explorados “geologicamente”
Fronteira = nível atual
Iterativamente avançar a fronteira para o nível
seguinte, cuidando para não voltar ao nível inferior
Busca em Largura
Inicialmente {s}
Os níveis são explorados “geologicamente”
Fronteira = nível atual
Iterativamente avançar a fronteira para o nível
seguinte, cuidando para não voltar ao nível inferior
Busca em Largura
Na busca em largura percorre-se todos os
vértices alcançáveis a partir de um vértice s, em
ordem de distância deste
Vértices a mesma distância podem ser percorridos em
qualquer ordem
Se constrói uma árvore de busca em largura com raiz em s.
Cada caminho de s a um vértice t corresponde a um caminho
mais curto de s a t
O processo é implementado
usando uma FILA
Busca em Largura
Uma fila é uma estrutura de dados que permite
armazenar uma sequência de valores mantendo
uma determinada ordem:
• “primeiro a entrar, primeiro a sair”
First-In-First-Out (FIFO)
Busca em Largura
O algoritmo de busca em largura atribui cores a
cada vértice
Exemplo 1
Grafo inicial
2 5
1 3 6
4
Exemplo 1
Passo 0
Fila = {4}
7
2 5
Origem s = 4
1 3 6
(0)
Exemplo 1
Passo 1
Fila = {}
7
2 5
1 3 6
4
(0)
Exemplo 1
Passo 2
Fila = {1, 3}
7
2 5
1 3 6
(1) (1)
(0)
Exemplo 1
Passo 3
Fila = {3}
7
2 5
1 3 6
(1) (1)
(0)
Exemplo 1
Passo 4
Fila = {3, 2}
7
(2) 2 5
1 3 6
(1) (1)
(0)
Exemplo 1
Passo 5
Fila = {2}
7
(2) 2 5
1 3 6
(1) (1)
(0)
Exemplo 1
Passo 6
Fila = {2, 6, 5}
7
(2) 2 5 (2)
1 3 6
(0)
Exemplo 1
Passo 7
Fila = {6, 5}
7
(2) 2 5 (2)
1 3 6
(0)
Exemplo 1
Passo 8
Fila = {6, 5, 7}
(3) 7
(2) 2 5 (2)
1 3 6
(0)
Exemplo 1
Passo 9
Fila = {5, 7}
(3) 7
(2) 2 5 (2)
1 3 6
(0)
Exemplo 1
Passo 10
Fila = {7}
(3) 7
(2) 2 5 (2)
1 3 6
(0)
Exemplo 1
Passo 11
Fila = {}
(3) 7
(2) 2 5 (2)
1 3 6
(0)
Exemplo 2
(3) 7
Como
determinamos o
(2) 2 5 (2) caminho exato
para: a partir do
?
?
1 3 6 vértice 4 chegar
(1) (1) (2)
ao vértice 5?
4
(0)
Exemplo 2
Grafo inicial
2 5
1 3 6
4
Exemplo 2
Passo 0
Fila = {4}
7
2 5
Predecessores:
1:
1 3 6 2:
3:
4: --
5:
4 6:
(0) 7:
Exemplo 2
Passo 1
Fila = {}
7
2 5
Predecessores:
1:
1 3 6 2:
3:
4: --
5:
4 6:
(0) 7:
Exemplo 2
Passo 2
Fila = {1, 3}
7
2 5
Predecessores:
1: 4
1 3 6 2:
(1) (1) 3: 4
4: --
5:
4 6:
(0) 7:
Exemplo 2
Passo 3
Fila = {3}
7
2 5
Predecessores:
1: 4
1 3 6 2:
(1) (1) 3: 4
4: --
5:
4 6:
(0) 7:
Exemplo 2
Passo 4
Fila = {3, 2}
7
(2) 2 5
Predecessores:
1: 4
1 3 6 2: 1
(1) (1) 3: 4
4: --
5:
4 6:
(0) 7:
Exemplo 2
Passo 5
Fila = {2}
7
(2) 2 5
Predecessores:
1: 4
1 3 6 2: 1
(1) (1) 3: 4
4: --
5:
4 6:
(0) 7:
Exemplo 2
Passo 6
Fila = {2, 6, 5}
7
(2) 2 5 (2)
Predecessores:
1: 4
1 3 6 2: 1
(1) (1) (2) 3: 4
4: --
5: 3
4 6: 3
(0) 7:
Exemplo 2
Passo 7
Fila = {6, 5}
7
(2) 2 5 (2)
Predecessores:
1: 4
1 3 6 2: 1
(1) (1) (2) 3: 4
4: --
5: 3
4 6: 3
(0) 7:
Exemplo 2
Passo 8
Fila = {6, 5, 7}
(3) 7
(2) 2 5 (2)
Predecessores:
1: 4
1 3 6 2: 1
(1) (1) (2) 3: 4
4: --
5: 3
4 6: 3
(0) 7: 2
Exemplo 2
Passo 9
Fila = {5, 7}
(3) 7
(2) 2 5 (2)
Predecessores:
1: 4
1 3 6 2: 1
(1) (1) (2) 3: 4
4: --
5: 3
4 6: 3
(0) 7: 2
Exemplo 2
Passo 10
Fila = {7}
(3) 7
(2) 2 5 (2)
Predecessores:
1: 4
1 3 6 2: 1
(1) (1) (2) 3: 4
4: --
5: 3
4 6: 3
(0) 7: 2
Exemplo 2
Passo 11
Fila = {}
(3) 7
(2) 2 5 (2)
Predecessores:
1: 4
1 3 6 2: 1
(1) (1) (2) 3: 4
4: --
5: 3
4 6: 3
(0) 7: 2
Exemplo 2
Predecessores:
1: 4
(3) 7
2: 1
3: 4
4: --
(2) 2 5 (2) 5: 3
6: 3
7: 2
1 3 6 Caminho exato
(1) (1) (2)
para: a partir do
vértice 4 chegar
4
(0) ao vértice 5?
Exemplo 2
Predecessores:
1: 4
(3) 7
2: 1
3: 4
4: --
(2) 2 5 (2) 5: 3
6: 3
7: 2
3 6
Caminho exato para:
1
a partir do vértice 4
(1) (1) (2) chegar ao vértice 5?
5→3→4
4
• Variáveis:
F (fila) , s (vértice de origem)
• Propriedades do vértice v:
v.cor (cor do vértice)
v.dist (distância do vértice v até a origem s)
v.pre (predecessor do vértice v)
• Funções :
Insere(F, v), permite inserir o vértice v na fila F
Remove(F), permite remover o primeiro vértice da fila F
Algoritmo
Busca em largura = Breadth First Search (BFS)
BFS(G,s):
Para cada vértice v em G.V-{s} faça
v.cor = BRANCO
v.dist = INFINITO
s.cor = CINZA
s.dist = 0
F = VAZIO
Insere(F, s)
BFS(G,s):
Para cada vértice v em G.V-{s} faça Inicialização
v.cor = BRANCO
v.dist = INFINITO
s.cor = CINZA
s.dist = 0
F = VAZIO
Insere(F, s)
r s t u
v w x z
Algoritmo
Para cada vértice v em G.V-{s} faça Inicialização
v.cor = BRANCO
v.dist = INFINITO
s.cor = CINZA
s.dist = 0
F = VAZIO
Insere(F, s)
v w x z
(Inf) (Inf) (Inf) (Inf)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
v w x z
(Inf) (Inf) (Inf) (Inf)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
u=s
v w x z
(Inf) (1,s) (Inf) (Inf)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
u=w
v w x z
(Inf) (1,s) (Inf) (Inf)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
u=w
v w x z
(Inf) (1,s) (2,w) (Inf)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
u=r
v w x z
(Inf) (1,s) (2,w) (Inf)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
u=r
v w x z
(2,r) (1,s) (2,w) (Inf)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
u=t
v w x z
(2,r) (1,s) (2,w) (Inf)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
u=t
v w x z
(2,r) (1,s) (2,w) (Inf)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
u=x
v w x z
(2,r) (1,s) (2,w) (Inf)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
u=x
v w x z
(2,r) (1,s) (2,w) (3,x)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
u=v
v w x z
(2,r) (1,s) (2,w) (3,x)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
u=u
v w x z
(2,r) (1,s) (2,w) (3,x)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
u=u
v w x z
(2,r) (1,s) (2,w) (3,x)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
u=z
v w x z
(2,r) (1,s) (2,w) (3,x)
Algoritmo
Percorre o grafo
Enquanto F VAZIO faça
u = Remove(F)
Para cada vértice v em G.Adj[u] faça Explora os vizinhos de u
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F, v)
u.cor = PRETO
u=z
v w x z
(2,r) (1,s) (2,w) (3,x)
Busca em Largura
(1,s) (0) (2,w) (3,t)
r s t u
v w x z
(2,r) (1,s) (2,w) (3,x)
https://www.cs.usfca.edu/~galles/visualization/BFS.html
Bibliografia
Capítulo 1 Capítulo 22
Atividade
• Calcule as seguintes informações do grafo:
(1) Número de componentes conexas
(2) Ordem e tamanho da maior componente conexa
(3) Ordem e tamanho da menor componente conexa
(4) Grau dos vértices: a, k, q
a b c d e
f g h k
m n p q r
Atividade
(5) Número de regiões do grafo planar formado pela maior
componente conexa
(6) Utilize o algoritmo de busca em largura para obter a distância:
(6.1) Do vértice a ao vértice q
(6.2) Do vértice c ao vértice q
a b c d e
f g h k
m n p q r
Atividade
(7) Como verificar se o grafo é não-conexo?
a b c d e
f g h k
m n p q r