Você está na página 1de 105

BCM0506 - Comunicação e Redes

Aula 3
Algoritmos de Busca em Grafos

Prof. Alexandre Donizeti Alves


Definições
Um caminho do vértice s ao vértice t é uma
sequência de vértices <s, u, v, … , t>, onde cada par
de vértices consecutivos é conectado por uma
aresta
Um caminho de s a t é um caminho mínimo se ele
tem comprimento mínimo
7

<1,2,5,3,4> é um caminho de 1 a 4
2 5

<1,4> é um caminho mínimo de 1 a 4


1 3 6

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

7 Vértices in-degree out-degree


1 1 0
2 5 2 1 1
3 3 2
1 3 4 1 1
5 0 1

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

Para um grafo direcionado, um laço soma


um ao grau de entrada e um ao grau de
saída
Definições

Um grafo é regular se todos os seus


vértices possuem o mesmo grau
Definições

A soma total dos graus de todos os


vértices de um grafo é sempre par

Em um grafo qualquer, o número de


vértices com grau ímpar tem que ser par
Definições
Um subgrafo consiste em um conjunto de vértices e um
conjunto de arestas que são subconjuntos do conjunto
original de vértices e arestas, respectivamente

2 5 2 5

1 3 6 1 3

4
Subgrafo

Um subgrafo é um grafo obtido apagando-se parte do grafo


original e deixando o resto sem modificações
Definições
Um subgrafo conexo de um grafo não-direcionado
G é dito uma componente conexa de G se não está
contido em qualquer subgrafo conexo maior de G

7 3

2
2 5 8 6

1 5
1 3 6
8

4 7
4

1 componente conexa 4 componentes conexas


Definições

Uma componente conexa de um grafo G é


um subgrafo conexo maximal de G

A condição de subgrafo maximal deriva do


fato de cada um não ser subgrafo próprio
de qualquer outro subgrafo conexo
Definições
Um grafo planar (i.e., com representação
planar) i.e., se ele é desenhado sem
cruzamento de arestas
Simulação

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

Verifique a fórmula de Euler para o grafo planar


simples e conexo na figura abaixo:
• R=2–O+T
Resposta do Exercício

Verifique a fórmula de Euler para o grafo planar


simples e conexo na figura abaixo:
• R=2–O+T

R = 2 – 13 + 19 = 8
Resposta do Exercício

Verifique a fórmula de Euler para o grafo planar


simples e conexo na figura abaixo:
• R=2–O+T

R = 2 – 13 + 19 = 8
Definições
Problema: Colorir um mapa sem
que regiões com fronteiras
comuns tivessem a mesma cor

Apenas 4 cores são necessárias e


suficientes para qualquer mapa
Representação de Grafos

• Matriz de Adjacência

• Matriz de Incidência

• Lista de Adjacência
Matriz de Adjacência

• A Matriz de Adjacência de um grafo tem


colunas e linhas indexadas pelos vértices
• Se A for a Matriz de Adjacência de índices i e
j, então A(i,j) = 1 se os vértices i e j forem
conectados por uma aresta, e A(i,j) = 0, caso
contrário
• Em grafos não orientados, a Matriz de
Adjacência é sempre simétrica, ou seja,
A(i,j) = A(j,i)
Exemplo

• Como este grafo é não orientado, a Matriz de


Adjacência é simétrica, ou seja, A(i,j) = A(j,i)
Exemplo
Exemplo

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

Observação: Em caso de aresta na forma de laço (self-loop),


podemos representá-la com o número “ 2 ” na respectiva
posição “linha x coluna”
Lista de Adjacência

• O vetor de Listas de Adjacência de um grafo


tem uma Lista Encadeada para cada um de seus
vértices

• A lista de cada vértice v contém todos os


vértices vizinhos que podem ser alcançados a
partir de v
Exemplo

Adj[1] = {2}
Adj[2] = {1,3,5}
Adj[3] = {4}
Adj[4] = {1,5}
Adj[5] = {2}

Lista encadeada (Linked list)


Grafos Ponderados

• Um grafo pode ser ponderado ou não ponderado

• Se todas as arestas apresentarem um mesmo


peso (ou custo), diz-se que o grafo é não
ponderado, e todas as arestas são consideradas
com custo igual a 1

• O grafo será ponderado se diferentes arestas


possuírem custos distintos
Exemplo
Em Grafos Ponderados, • Pode-se ainda representar
representa-se entre um Grafo Não Ponderado
parênteses o custo da ignorando os custos das
aresta arestas
• Em um Grafo Não
Ponderado, todas as
arestas possuem custo
igual a 1
Exemplo
Matriz de Adjacência A B C D E F G H

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

A matriz de adjacência ocupa O(n2)


posições de memória

A matriz de incidência ocupa O(n.m)


posições de memória

A lista de adjacência ocupa O(n + m)


posições de memória
Busca em Grafos
Em muitas aplicações de redes é necessário percorrer
rapidamente o grafo, visitando-se todos os vértices
Para que isso seja realizado de forma sistemática e
organizada, são utilizados algoritmos de busca em
grafos
As buscas são usadas em diversas aplicações para
determinar informações relevantes sobre a estrutura
do grafo:
- Web crawling
- Redes de computadores
- Redes sociais
- Redes de colaboração acadêmica
Busca em Grafos
Os algoritmos de busca em grafos permite
percorrer o grafo buscando todos os vértices que
são acessíveis a partir de um determinado
vértice em questão, sem considerar
especificamente seu objetivo até que o encontre

Existem diversas maneiras de realizar a busca:


Cada estratégia se caracteriza pela ordem em
que os vértices são visitados
Busca em Grafos
• Os algoritmos de busca em grafos podem então
nos mostrar outras características de grafos
• Os algoritmos mais comumente discutidos são
Busca em Largura
Busca em Profundidade
Busca em Largura
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

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

(1) (1) (2)

(0)
Exemplo 1
Passo 7
Fila = {6, 5}
7

(2) 2 5 (2)

1 3 6

(1) (1) (2)

(0)
Exemplo 1
Passo 8
Fila = {6, 5, 7}
(3) 7

(2) 2 5 (2)

1 3 6

(1) (1) (2)

(0)
Exemplo 1
Passo 9
Fila = {5, 7}
(3) 7

(2) 2 5 (2)

1 3 6

(1) (1) (2)

(0)
Exemplo 1
Passo 10
Fila = {7}
(3) 7

(2) 2 5 (2)

1 3 6

(1) (1) (2)

(0)
Exemplo 1
Passo 11
Fila = {}
(3) 7

(2) 2 5 (2)

1 3 6

(1) (1) (2)

(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

(0) O caminho será <4, 3, 5>

Para o caminho entre a origem e o destino, parte-se do vértice de destino


até chegar à origem. Depois inverte-se o vetor obtido
Algoritmo
• Constantes:
BRANCO , CINZA ,PRETO, INFINITO

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

Enquanto F VAZIO faça


u = Remove(F)
Para cada vértice v em G.Adj[u] faça
se v.cor == BRANCO
v.cor = CINZA
v.dist = u.dist + 1
v.pre = u
Insere(F,v)
u.cor = PRETO
Algoritmo
Busca em largura = Breadth First Search (BFS)

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)

Enquanto F VAZIO faça Percorre o grafo


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

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)

(Inf) (0) (Inf) (Inf)


r s t u 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

(Inf) (0) (Inf) (Inf)


r s t u 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

(1,s) (0) (Inf) (Inf)


r s t u F = {w, r}

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

(1,s) (0) (Inf) (Inf)


r s t u F = {r}

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

(1,s) (0) (2,w) (Inf)


r s t u F = {r, t, x}

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

(1,s) (0) (2,w) (Inf)


r s t u F = {t, x}

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

(1,s) (0) (2,w) (Inf)


r s t u F = {t, x, v}

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

(1,s) (0) (2,w) (Inf)


r s t u F = {x, v}

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

(1,s) (0) (2,w) (3,t)


r s t u F = {x, v, u}

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

(1,s) (0) (2,w) (3,t)


r s t u F = {v, u}

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

(1,s) (0) (2,w) (3,t)


r s t u F = {v, u, z}

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

(1,s) (0) (2,w) (3,t)


r s t u F = {u, z}

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

(1,s) (0) (2,w) (3,t)


r s t u F = {z}

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

(1,s) (0) (2,w) (3,t)


r s t u F = {z}

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

(1,s) (0) (2,w) (3,t)


r s t u F = {}

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

(1,s) (0) (2,w) (3,t)


r s t u F = {}

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)

Caminho mínimo do vértice s ao vértice u:


u.pre = t
t.pre = w
w.pre = s

Assim : <s, w, t, u>


Algoritmo
O algoritmo de busca em grafos também trabalha
com grafos não conexos

Para tais casos, apenas os vértices v que estão na


mesma componente do vértice s terão valores
v.dist INFINITO

Podemos usar o atributo v.dist de todos os


vértices para decidir se o grafo é conexo
Complexidade
Cada vértice só entra na fila uma vez

Inserir e remover na fila possuem complexidade


constante, realizadas |V|

A lista de adjacências de cada vértice é examinada


apenas uma vez

Logo, se representarmos o grafo por uma lista de


adjacências, a busca em largura tem complexidade
O(n + m)
Simulação

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?

(8) Como saber quais vértices são alcançáveis a partir de c?

a b c d e

f g h k

m n p q r

Você também pode gostar