Buscar

aula26

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 84 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 84 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 84 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

AULA 26
ESTRUTURA DE DADOS
Grafos – Busca em Profundidade
Norton T. Roman & Luciano A. Digiampietri
Grafos – Busca em Profundidade
Fazer buscas em um grafo significa seguir suas arestas
sistematicamente, de modo a visitar seus vértices
A estratégia seguida pela busca em profundidade
(Depth-first search ou DFS) é buscar mais fundo no
grafo sempre que possível
A busca para quando encontramos o que queríamos
ou visitamos todos os vértices
Grafos – Busca em Profundidade
Fazer buscas em um grafo significa seguir suas arestas
sistematicamente, de modo a visitar seus vértices
A estratégia seguida pela busca em profundidade
(Depth-first search ou DFS) é buscar mais fundo no
grafo sempre que possível
A busca para quando encontramos o que queríamos
ou visitamos todos os vértices
Grafos – Busca em Profundidade
Fazer buscas em um grafo significa seguir suas arestas
sistematicamente, de modo a visitar seus vértices
A estratégia seguida pela busca em profundidade
(Depth-first search ou DFS) é buscar mais fundo no
grafo sempre que possível
A busca para quando encontramos o que queríamos
ou visitamos todos os vértices
Grafos – Busca em Profundidade
Na busca em profundidade, as arestas são exploradas a
partir do vértice v mais recentemente descoberto que
ainda tem arestas não exploradas saindo dele.
Quando todas as arestas de v são exploradas, a
busca volta ao vértice anterior a v (backtracking),
para seguir arestas ainda não exploradas
Grafos – Busca em Profundidade
Na busca em profundidade, as arestas são exploradas a
partir do vértice v mais recentemente descoberto que
ainda tem arestas não exploradas saindo dele.
Quando todas as arestas de v são exploradas, a
busca volta ao vértice anterior a v (backtracking),
para seguir arestas ainda não exploradas
Grafos – Busca em Profundidade
O processo continua até que tenhamos descoberto
todos os vértices que são atingíveis a partir do vértice
inicial
Um vértice v é atingível a partir de um vértice u se
houver um caminho de u a v no grafo
Se restarem ainda vértices não visitados, um é
selecionado e reiniciamos a busca a partir dele.
Grafos – Busca em Profundidade
O processo continua até que tenhamos descoberto
todos os vértices que são atingíveis a partir do vértice
inicial
Um vértice v é atingível a partir de um vértice u se
houver um caminho de u a v no grafo
Se restarem ainda vértices não visitados, um é
selecionado e reiniciamos a busca a partir dele.
Grafos – Busca em Profundidade
O processo continua até que tenhamos descoberto
todos os vértices que são atingíveis a partir do vértice
inicial
Um vértice v é atingível a partir de um vértice u se
houver um caminho de u a v no grafo
Se restarem ainda vértices não visitados, um é
selecionado e reiniciamos a busca a partir dele.
DFS – Funcionamento
Defina um nó inicial
Escolha um de seus adjacentes ainda não visitados
Visite-o
Repita o processo até atingir o nó objetivo, ou um nó cuja
adjacência já tenha sido toda visitada (nó final)
Se atingir um nó final que não seja objetivo:
Volte ao pai deste
Continue de um nó irmão ainda não visitado
DFS – Reescrevendo...
Defina um nó inicial
Enquanto este não for um nó objetivo ou final (nó cuja adjacência já
tenha sido toda visitada)
Escolha um de seus adjacentes ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão escolha outro nó inicial
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
oufinal (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Defina um nó inicial
Enquanto este não for um nó objetivo
ou final (nó cuja adjacência já tenha
sido toda visitada)
Escolha um de seus adjacentes
ainda não visitados
Visite-o
Se nó final não objetivo:
Volte ao pai deste
Se houver pai, repita. Senão
escolha outro nó inicial
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Note quea estrutura
resultante foi uma árvore
De fato, duas – uma
floresta
São as árvores de busca
em profundidade
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Note que a estrutura
resultante foi uma árvore
De fato, duas – uma
floresta
São as árvores de busca
em profundidade
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Note que a estrutura
resultante foi uma árvore
De fato, duas – uma
floresta
São as árvores de busca
em profundidade
v0
v1
v2
v3
v4
v5
DFS – Funcionamento
Note que a estrutura
resultante foi uma árvore
De fato, duas – uma
floresta
São as árvores de busca
em profundidade
v0
v1
v2
v3
v4
v5
Grafos – Busca em Profundidade
Ideia intuitiva – usamos em nosso dia a dia
Quando exploramos um ambiente, geralmente
seguimos uma direção preferencial, tomando
decisões quando há mais opções de caminhos
Se nos deparamos com um ambiente sem outra
saída, voltamos ao ponto da última decisão e
escolhemos outro caminho
Grafos – Busca em Profundidade
Ideia intuitiva – usamos em nosso dia a dia
Quando exploramos um ambiente, geralmente
seguimos uma direção preferencial, tomando
decisões quando há mais opções de caminhos
Se nos deparamos com um ambiente sem outra
saída, voltamos ao ponto da última decisão e
escolhemos outro caminho
Grafos – Busca em Profundidade
Ideia intuitiva – usamos em nosso dia a dia
Quando exploramos um ambiente, geralmente
seguimos uma direção preferencial, tomando
decisões quando há mais opções de caminhos
Se nos deparamos com um ambiente sem outra
saída, voltamos ao ponto da última decisão e
escolhemos outro caminho
DFS – Implementação
Nessa implementação,
iremos “colorir” os
vértices durante a busca,
indicando seu estado
Cada vértice é
inicialmente branco
v0
v1
v2
v3
v4
v5
DFS – Implementação
Nessa implementação,
iremos “colorir” os
vértices durante a busca,
indicando seu estado
Cada vértice é
inicialmente branco
v0
v1
v2
v3
v4
v5
DFS – Implementação
É feito amarelo quando
descoberto na busca
É feito vermelho quando
for finalizado (quando sua
lista de adjacentes for
completamente
examinada)
v0
v1
v2
v3
v4
v5
DFS – Implementação
É feito amarelo quando
descoberto na busca
É feito vermelho quando
for finalizado (quando sua
lista de adjacentes for
completamente
examinada)
v0
v1
v2
v3
v4
v5
DFS – Implementação
Também não buscaremos
por um nó específico
Faremos apenas uma
caminhada pelo grafo
usando o algoritmo de
busca em profundidade
v0
v1
v2
v3
v4
v5
DFS – Implementação
Também não buscaremos
por um nó específico
Faremos apenas uma
caminhada pelo grafo
usando o algoritmo de
busca em profundidade
v0
v1
v2
v3
v4
v5
DFS – Implementação
E, por tratar-se de uma
operação de busca,
usaremos a representação
que melhor se adequa a
isso
No caso, lista de
adjacências
v0
v1
v2
v3
v4
v5
DFS – Implementação
E, por tratar-se de uma
operação de busca,
usaremos a representação
que melhor se adequa a
isso
No caso, lista de
adjacências
v0
v1
v2
v3
v4
v5
DFS – Implementação
Começamos com as
definições já vistas para a
lista de adjacências
Definindo também
códigos para as “cores”
usadas
#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
typedef int bool;
typedef int TIPOPESO;
#define BRANCO 0
#define AMARELO 1
#define VERMELHO 2
DFS – Implementação
Começamos com as
definições já vistas para a
lista de adjacências
Definindo também
códigos para as “cores”
usadas
#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
typedef int bool;
typedef int TIPOPESO;
#define BRANCO 0
#define AMARELO 1
#define VERMELHO 2
DFS – Implementação
Passamos então à
definição do grafo:
typedef struct adjacencia {
int vertice;
TIPOPESO peso;
struct adjacencia *prox;
} ADJACENCIA;
typedef struct vertice {
/* Outros dados vão aqui*/
ADJACENCIA *cab;
} VERTICE;
typedef struct grafo {
int vertices;
int arestas;
VERTICE *adj;
} GRAFO;
DFS – Implementação
E, finalmente, à
caminhada no grafo
Começamos definindo um
arranjo de cores, que
armazenará a cor de cada
vértice
void profundidade(GRAFO *g) {
int cor[g->vertices];
int u;
for (u=0;u<g->vertices;u++) {
cor[u] = BRANCO;
}
for (u=0;u<g->vertices;u++) {
if (cor[u] == BRANCO)
visitaP(g,u,cor);
}
}
DFS – Implementação
E, finalmente, à
caminhada no grafo
Começamos definindo um
arranjo de cores, que
armazenará a cor de cada
vértice
void profundidade(GRAFO *g) {
int cor[g->vertices];
int u;
for (u=0;u<g->vertices;u++) {
cor[u] = BRANCO;
}
for (u=0;u<g->vertices;u++) {
if (cor[u] == BRANCO)
visitaP(g,u,cor);
}
}
DFS – Implementação
O índice do vértice no
arranjo adj em GRAFO
será o mesmo do arranjo
cor
Inicializamos todos os
vértices com branco
void profundidade(GRAFO *g) {
int cor[g->vertices];
int u;
for (u=0;u<g->vertices;u++) {
cor[u] = BRANCO;
}
for (u=0;u<g->vertices;u++) {
if (cor[u] == BRANCO)
visitaP(g,u,cor);
}
}
DFS – Implementação
O índice do vértice no
arranjo adj em GRAFO
será o mesmo do arranjo
cor
Inicializamos todos os
vértices com branco
void profundidade(GRAFO *g) {
int cor[g->vertices];
int u;
for (u=0;u<g->vertices;u++) {
cor[u] = BRANCO;
}
for (u=0;u<g->vertices;u++) {
if (cor[u] == BRANCO)
visitaP(g,u,cor);
}
}
DFS – Implementação
A verificação de todos os
vértices brancos serve
para garantir que, uma
vez esgotada uma árvore
de busca, possamos
reiniciar de algum outro
vértice não visitado
void profundidade(GRAFO *g) {
int cor[g->vertices];
int u;
for (u=0;u<g->vertices;u++) {
cor[u] = BRANCO;
}
for (u=0;u<g->vertices;u++) {
if (cor[u] == BRANCO)
visitaP(g,u,cor);
}
}
DFS – Implementação
A verificação de todos os
vértices brancos serve
para garantir que, uma
vez esgotada uma árvore
de busca, possamos
reiniciar de algum outro
vértice não visitado
v0
v1
v2
v3
v4
v5
início
DFS – Implementação
A verificação de todos os
vértices brancos serve
para garantir que, uma
vez esgotada uma árvore
de busca, possamos
reiniciar de algum outro
vértice não visitado
v0
v1
v2
v3
v4
v5reinício
DFS – Implementação
void visitaP(GRAFO *g, int u,
int *cor) {
cor[u] = AMARELO;
ADJACENCIA *v = g->adj[u].cab;
while (v) {
if (cor[v->vertice]==BRANCO)
visitaP(g,v->vertice,cor);
v = v->prox;
}
cor[u] = VERMELHO;
}
Ao visitar um nó, o
marcamos com amarelo
Então visitamos sua
adjacência (arestas (u, v))
recursivamente
Mas apenas vértices
ainda não visitados
DFS – Implementação
void visitaP(GRAFO *g, int u,
int *cor) {
cor[u] = AMARELO;
ADJACENCIA *v = g->adj[u].cab;
while (v) {
if (cor[v->vertice]==BRANCO)
visitaP(g,v->vertice,cor);
v = v->prox;
}
cor[u] = VERMELHO;
}
Ao visitar um nó, o
marcamos com amarelo
Então visitamos sua
adjacência (arestas (u, v))
recursivamente
Mas apenas vértices
ainda não visitados
DFS – Implementação
void visitaP(GRAFO *g, int u,
int *cor) {
cor[u] = AMARELO;
ADJACENCIA *v = g->adj[u].cab;
while (v) {
if (cor[v->vertice]==BRANCO)
visitaP(g,v->vertice,cor);
v = v->prox;
}
cor[u] = VERMELHO;
}
Ao visitar um nó, o
marcamos com amarelo
Então visitamos sua
adjacência (arestas (u, v))
recursivamente
Mas apenas vértices
ainda não visitados
DFS – Implementação
void visitaP(GRAFO *g, int u,
int *cor) {
cor[u] = AMARELO;
ADJACENCIA *v = g->adj[u].cab;
while (v) {
if (cor[v->vertice]==BRANCO)
visitaP(g,v->vertice,cor);
v = v->prox;
}
cor[u] = VERMELHO;
}
Ao visitar um nó, o
marcamos com amarelo
Então visitamos sua
adjacência (arestas (u, v))
recursivamente
Mas apenas vértices
ainda não visitados
DFS – Implementação
void visitaP(GRAFO *g, int u,
int *cor) {
cor[u] = AMARELO;
ADJACENCIA *v = g->adj[u].cab;
while (v) {
if (cor[v->vertice]==BRANCO)
visitaP(g,v->vertice,cor);
v = v->prox;
}
cor[u] = VERMELHO;
}
Visitada toda a adjacência
de u, o finalizamos,
marcando de vermelho
DFS – Implementação
E se quisermos incluir
uma chave de busca?
Chaves de busca são
incluídas inicialmente em
VERTICE
E verificadas quando o nó
é visitado
typedef struct vertice {
/* Outros dados vão aqui*/
ADJACENCIA *cab;
} VERTICE;void visitaP(GRAFO *g, int u,
int *cor) {
cor[u] = AMARELO;
ADJACENCIA *v = g->adj[u].cab;
...
}
DFS – Implementação
E se quisermos incluir
uma chave de busca?
Chaves de busca são
incluídas inicialmente em
VERTICE
E verificadas quando o nó
é visitado
typedef struct vertice {
/* Outros dados vão aqui*/
ADJACENCIA *cab;
} VERTICE;
void visitaP(GRAFO *g, int u,
int *cor) {
cor[u] = AMARELO;
ADJACENCIA *v = g->adj[u].cab;
...
}
DFS – Implementação
E se quisermos incluir
uma chave de busca?
Chaves de busca são
incluídas inicialmente em
VERTICE
E verificadas quando o nó
é visitado
typedef struct vertice {
/* Outros dados vão aqui*/
ADJACENCIA *cab;
} VERTICE;
void visitaP(GRAFO *g, int u,
int *cor) {
cor[u] = AMARELO;
ADJACENCIA *v = g->adj[u].cab;
...
}
AULA 26
ESTRUTURA DE DADOS
Grafos – Busca em Profundidade
Norton T. Roman & Luciano A. Digiampietri

Outros materiais