Introdução
Um algoritmo de busca é um algoritmo que passa por todos os vértices e todos os arcos de um digrafo.
Cada arco é visitado apenas uma só vez. Depois de visitar a a origem de um arco, o algoritmo percorre o arco e visita seu destino.
Existem muitos algoritmos de busca, cada um possui uma estratégia específica que é caracterizada pela ordem que os vértices são visitados.
Diremos que o k-ésimo vértice visitado durante a busca tem número de ordem k-1 .
Trataremos aqui da busca em profundidade (= depth-first search - DFS). A busca em profundidade está relacionada com conceitos como backtracking, varredura de árvore em pré-ordem.
(Esta parte corresponde aproximadamente às seções 18.1 (Exploring a Maze) e 18.2 (Depth-First Search) do capítulo 18 (Graph Search) do livro de Sedgewick.)
A DFS em si
A função dfs abaixo realiza a estrutura geral de uma busca em profundidade.
Referências: IMEUm algoritmo de busca é um algoritmo que passa por todos os vértices e todos os arcos de um digrafo.
Cada arco é visitado apenas uma só vez. Depois de visitar a a origem de um arco, o algoritmo percorre o arco e visita seu destino.
Existem muitos algoritmos de busca, cada um possui uma estratégia específica que é caracterizada pela ordem que os vértices são visitados.
Diremos que o k-ésimo vértice visitado durante a busca tem número de ordem k-1 .
Trataremos aqui da busca em profundidade (= depth-first search - DFS). A busca em profundidade está relacionada com conceitos como backtracking, varredura de árvore em pré-ordem.
(Esta parte corresponde aproximadamente às seções 18.1 (Exploring a Maze) e 18.2 (Depth-First Search) do capítulo 18 (Graph Search) do livro de Sedgewick.)
A DFS em si
A função dfs abaixo realiza a estrutura geral de uma busca em profundidade.
//Autor: Filipe Areias Névola
//Ano: 2009
//Licensa: Você pode usar e alterar, mas deve manter o Autor
#define MAXV 100 //número máximo de vértices
int G[MAXV][MAXV]; //grafo representado por matriz de adjacência
int visitado[MAXV]; //se for 1 vértice já visitado, caso contrário 0. Começa com 0 em todas as posições
int n; //número de vértices neste grafo
//Busca em profundidade a partir de um vértice origem
//vértices estão númerados de 0 até n-1
void dfsDigrafo(){
int v;
for(v = 0; v < n; ++v) //ninguém foi visitado
visitado[v] = 0;
for(v = 0; v < n; ++v){ //roda todos os vértices
if( visitado[v] == 0 ){ //se ainda não foi visitado
dfs(v); //faz a busca para esse vértice
}
}
}
void dfs(int origem){
int v = origem; //vértice atual
visitado[v] = 1; //origem está visitada
for(int i = 0; i < n; ++i){ //rodar todas as possíveis arestas de v
if (G[v][i] == 1 && visitado[i] == 0){ //existe aresta e ainda não visitou
//Faz aqui o que quiser antes da chamada recursiva...
dfs(i); //visita esse vértice
//Faz aqui o que quiser após o retorno do backtracking
}
}
}
Show de bola kra!
me ajuda pra krai esse seu post!
vlw