Exemple #1
0
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;
	}

}
int main(){
    Fila* f;
    int tam, op;
     
    P("Informe o tamanho da fila circular: ");
    scanf("%d", &tam);
     
    f = criaFila(tam);
     
    do{
        system("cls");
        P("Escolha uma das opcoes abaixo --\n");
        P("\t1. Inserir um elemento na fila circular;\n");
        P("\t2. Remover um elemento da fila circular;\n");
        P("\t3. Fila vazia ?\n");
        P("\t4. Mostrar a fila circular;\n");
        P("\t5. Sair.\n");
        P("Resposta escolhida: ");
        scanf("%d", &op);
          
        switch(op){
            case 1:{
                int valor;
                  
                P("Digite o valor a ser inserido na fila circular: ");
                scanf("%d", &valor);
                    
                insereFila(f, valor);
            }
            break;           
            case 2: {
                if(filaVazia(f))
                    P("Fila vazia.\n");
                else
                    printf("Valor removido: %d.\n", removeFila(f));
                    getch();
            }
            break;
            case 3: {
                if(filaVazia(f))
                    P("Fila vazia.\n");
                else
                    P("Fila nao esta vazia.\n");
                    getch();
            }
            break;
            case 4: mostraFila(f);
            break;
            case 5: exit(0);
            break;
            default : {
                P("Opcao invalida.\n");
                getch();
            }
            break;
        }
    }while(op != 5);
    getch();
    return 0;
}
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);
}
//Função responsável por realizar a busca em largura no grafo
int bfs(){
    // Cria um vetor para marcar quais vértices já foram visitados
    int *visited, n;
    visited = (int *)malloc(numVertices * sizeof(int));
    if(visited == NULL){printf("Falta de memoria!\n");exit(0);}
    for(int i = 0; i < numVertices; i++){
        visited[i] = 0;
    }

    // Cria a fila para executar a busca em largura
    struct fila *q = NULL, *fim = NULL;
    q = insereFila(q, &fim, inicio);
    visited[inicio] = 1;
    pai[inicio] = -1;

    // Inicia a busca em largura
    while (q != NULL){
        int u = q->val;
        q = removeFila(q);

        for (int v=0; (v<numVertices); v++){
            if (visited[v]==0 && redeResidual[u][v] > 0){
                q = insereFila(q, &fim, v);
                pai[v] = u;
                visited[v] = 1;
                if(v == destino){
                    n = visited[destino];
                    free(visited);
                    q = limpaFila(q, &fim);
                    return (n == 1);
                }
            }
        }
    }

    // Retorna verdadeira caso encontre um novo caminho da superorigem até o superdestino
    // Retorna falso, caso contrário
    n = visited[destino];
    free(visited);
    q = limpaFila(q, &fim);
    return (n == 1);
}
Exemple #5
0
void testeFila () {
    
    //Define o tamanho maximo da fila
    int NMAX = 100;
    
    //Inicializa o vetor onde a fila sera armazenada
    dado *fila = malloc(sizeof(dado) * NMAX);
    //Cria os indicadores de inicio e fim
    int inicio, fim;
    
    //Inicializa a fila
    criaFila(fila, NMAX, &inicio, &fim);
    
    //Insere 2 elementos
    insereFila(fila, &inicio, &fim, 3, NMAX);
    insereFila(fila, &inicio, &fim, 10, NMAX);
    
    //Exibe a fila atual
    exibeFila(fila, inicio, fim);
    
    //Desempilha um elemento e imprime
    dado desempilhado;
    desempilhaFila(fila, &inicio, &fim, &desempilhado);
    
    printf("\nElemento desempilhado: %d\n", desempilhado);
    
    //Mostra a nova fila
    exibeFila(fila, inicio, fim);
    
    printf("\nForcando underflow:\n");
    //Forca underflow
    while (desempilhaFila(fila, &inicio, &fim, &desempilhado) == OK) {
        printf("    Desempilhei alguem...\n");
    }
    
    printf("    Underflow!\n");
    
    //Mostra a fila apos o overflow
    exibeFila(fila, inicio, fim);
    
    printf("\nVou empilhar para ver se ainda funciona:\n");
    
    //Empilha coisas para ver se ainda funciona
    if (insereFila(fila, &inicio, &fim, 10, NMAX)==OK) printf("    Tudo ok!\n");
    
    //Mostra a fila apos insercao
    exibeFila(fila, inicio, fim);
    
    printf("\nForcando Overflow!\n");
    //Empilha ate ter overflow
    while (insereFila(fila, &inicio, &fim, 0, NMAX) == OK);
    
    printf("    Overflow!\n");
    //Se quiser ver:
    //exibeFila(fila, inicio, fim);
    
    printf("\nDesempilhando um elemento e tentando reempilhar:\n");
    //Desempilha um elemento e tenta empilhar outro:
    desempilhaFila(fila, &inicio, &fim, &desempilhado);
    if (insereFila(fila, &inicio, &fim, 0, NMAX) == OK) {
        printf("    Empilhado com sucesso.\n");
    } else {
        printf("    Ueh... Pq nao empilhou?\n");
    }
    
    //O empilhamento falou por causa da implementacao linear da fila.
    //Observe o processo ate agora:
    /*
     
     Inicial:   Empilhamento     Empilhamento      Desempilhamento
     ||       -> |elm1|    ->  |elm1|elm2|     ->   |elm2|
     inicio = fim   inic; fim+1   inicio   fim+2      inic+1 fim+2
     */
    
    //Ao desempilharmos, nao mudamos o incide de 'fim', mas sim apenas o indice de 'inicio'
    //Isso faz com que a fila ainda pareca cheia quando se tenta empilhar um elemento, mesmo
    //que haja espaco no comeco do vetor.
    
    //Isso motiva a implementacao circular das filas (Veja exemplo).
    
}