A busca em profundidade é um algoritmo para realizar busca e travessia numa árvore ou em um grafo. A ideia do algoritmo é começar num nó raiz e explora cada um dos seus ramos tanto quanto possível antes de retroceder.
Aplicações:
- Descobrir se um grafo é conexo.
- Descobrir se um grafo é bipartido.
- Encontrar componentes fortemente conexas.
- Encontrar articulações.
- Encontrar pontes.
- Encontrar uma ordenação topológica.
- Resolver quebra-cabeças.
Vamos implementar a busca em profundidade utilizando as ferramentas da STL.
#include <iostream>
#include <vector>
#define all(c) (c).begin, (c).end()
#define tr(c,it) for(typeof((c).begin()) it = (c).begin() ; it != (c).end() ; it++ )
using namespace std;
typedef vector <int> vi;
typedef vector <vi> vvi;
typedef vector <bool> vb;
void dfs(int i, vvi g ,vb & marc, int & cont){
if( !marc[i] ){
cont++;
marc[i] =true;
tr(g[i],it){
dfs(*it, g, marc, cont);
}
}
}
int main(){
int N,M;
int a,b;
int cont;
while(1){
cin >> N >> M;
vvi g(N+1);
for(int i =0;i<M;i++){
cin >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
}
vb marc(N+1,false);
cont = 0 ;
dfs(1, g, marc, cont);
if(cont==N)
cout << "Normal\n" ;
else
cout << "Falha\n" ;
}
}
Nenhum comentário:
Postar um comentário