Exemplo n.º 1
0
Arquivo: 1082.c Projeto: Gruutak/uri
void BFS(int graph[MAXN][MAXN], int raiz, int N) {
    int fila[MAXN], i, inicioFila = 0, fimFila = -1, inicioComponente = 0, fimComponente = -1;
	int atual;

	cor[raiz] = CINZA;

	inicFila(fila);
	inicFila(componente);

	insereFila(fila, inicioFila, &fimFila, raiz);
	insereFila(componente, inicioComponente, &fimComponente, raiz);

	while(!filaVazia(fila, inicioFila, fimFila)) {
		atual = retiraFila(fila, &inicioFila, fimFila);
		for (i = 0; i < N; i++) {
			if(i != atual) {
				if(graph[atual][i] > 0) {
					if(cor[i] == BRANCO) {
						cor[i] = CINZA;
						insereFila(fila, inicioFila, &fimFila, i);
						insereFila(componente, inicioComponente, &fimComponente, i);
					}
				}
			}
		}
		cor[atual] = PRETO;
	}

}
void buscaLargura(Grafo g, int partida)
{
	int i, v, a, w;
	Fila fila = criaFila();
	Lista listaBrancos = criaLista();
	Lista listaPretos = criaLista();
	Lista listaVisitados = criaLista();

	for(i = GVprimeiroVertice(g); i != 0; i = GVproximoVertice(g, i))
	{
		insereNaLista(listaBrancos, i);
	}

	printf("Todas os vértices estão brancos.\n");
	printf("Nenhuma aresta foi visitada.\n");

	v = partida;
	printf("O vertice %d está cinza.\n", v);
	insereFila(fila, v);
	retiraLista(listaBrancos, pegaPosLista(listaBrancos, v));
	
	while(!vaziaFila(fila))
	{
		v = retiraFila(fila);
		printf("Vertice %d ativado.\n", v);
		for(a = GAprimaSaida(g,v); a != 0; a = GAproxSaida(g,v,a))
		{
			insereNaLista(listaVisitados, a);
			printf("A aresta %d foi visitada.\n", a);
			w = GVvizinho(g,a,v);
			if(existeNaLista(listaBrancos, w))
			{
				insereFila(fila, w);
				printf("O vertice %d está cinza.\n", w);
				retiraLista(listaBrancos, pegaPosLista(listaBrancos, w));
			}
		}
		insereNaLista(listaPretos, v);
		printf("O vertice %d está preto.\n", v);
		printf("Vertice %d desativado.\n", v);
	}
	destroiLista(listaBrancos);
	destroiLista(listaPretos);
	destroiFila(fila);
}