//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);
}
Example #2
0
void percurso_em_largura(ABP a, void (*mostra_info)(void *) ){
     if(a.raiz == NULL)
        printf("Arvore vazia!\n");
     else{
        printf("Percurso em largura:\n\n");
        FilaEncadeada f;
        inicializaFila(&f, sizeof(NoABP)); // Fila de nós da árvore
        inserir(&f, a.raiz); // O campo "raiz" é um ponteiro, portanto, não precisa do "&"...
        while(!filaVazia(f)){
           NoABP n;
           remover(&f, &n);
           (*mostra_info)(n.info); // Mostra nó (1o. da fila)
           if(n.esq != NULL)       // Insere filhos na fila
              inserir(&f, n.esq);
           if(n.dir != NULL)
              inserir(&f, n.dir);
        }
        limpaFila(&f);
     }
     printf("----------------------\n\n");
}
Example #3
0
void escolhe(int resposta, node* Fila)
{
    switch(resposta)
    {
        case 0:
            limpaFila(Fila);
            break;
        case 1:
            exibeFila(Fila);
            break;
        case 2:
            novoFinal(Fila);
            break;
        case 3:
            removePrimeiro(Fila);
            break;
        case 4:
            criaFila(Fila);
            break;
        default:
            puts("\nOpção inválida! Verifique novamente as opções apresentadas.");
    }
}
Example #4
0
void cria_socket_externo(int *vetorPortas) {
	int l;
	 
	//Criando socket tcp para esperar conexoes
	if ((servSockExt = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))<0){
		perror("criacao socket interno falhou");
		exit(1);
	}
	//printf("socket externo criado... %d\n", servSockExt);

	//Construindo endereco de conexao
	memset(&echoServAddrExt, 0, sizeof(echoServAddrExt));
	echoServAddrExt.sin_family = AF_INET;
	echoServAddrExt.sin_addr.s_addr = htonl(INADDR_ANY);
	echoServAddrExt.sin_port = htons(vetorPortas[0]);

	//Bind ao endereco local
	if (bind(servSockExt, (struct sockaddr *)&echoServAddrExt, sizeof(echoServAddrExt))<0) {
		perror("bind externo falhou");
		exit(1);
	}
	//printf("bind externo feito...\n");
	
	//Fazendo listen
	if (listen(servSockExt,5)<0) {
		perror("listen externo falhou");
		exit(1);
	}
	//printf("listen externo feito\n");
	
	//Criacao da fila de mensagens
	fila *q_ext;
	q_ext = criaFila();

	//Inicializa vetor de semaforos
	int z;
	for(z=0;z<NUM_PROCS;z++) {
		sem[z] = 1;
	}

	//Esperando conexoes com accept
	while(1) {
		
		inf *mens_ext;
		
		sprintf(echoBuffer,"");
		
		printf("esperando conexao externa\n");
		clntLen = sizeof(echoClntAddrExt);
		if((clntSockExt = accept(servSockExt, (struct sockaddr *)&echoClntAddrExt, &clntLen))<0) {
			perror("accept externo falhou");
			exit(1);
		}
		
		//printf("Tratando cliente %s\n", inet_ntoa(echoClntAddrExt.sin_addr));
		recv(clntSockExt, echoBuffer, sizeof(echoBuffer), 0);
				
		sscanf(echoBuffer,"%d %d %d %d",&garfo,&idf,&msg,&rel);
		
		//printf("Sou externo e fiz o sscanf %d %d %d %d\n", garfo, idf, msg, rel);

//	printf("Sou externo e recebi essa msg do interno %s\n",echoBuffer);
		mens_ext = criarInfo(garfo, idf, msg, rel);
		sleep(1);
		
// 		printf("Sou externo e criei o info %d %d %d %d\n",mens_ext->garfo,mens_ext->idf, mens_ext->msg, mens_ext->rel);
		
		//atualiza o relogio
		relogio++;
		rel = max(relogio, rel);
		mens_ext->rel = rel;

		//switch de tipo de msg
		if((mens_ext->msg == POP) || (mens_ext->msg == VOP)) {
			
			//Insere o nodo na fila de requisicoes
			insere(q_ext,mens_ext);
// 			printf("Sou externo e vou inserir essa mensagem na fila %d %s %d\n", mens_ext->idf, mens_ext->msg, mens_ext->rel);
			
			//Broadcast para todos os outros
			sprintf(echoBuffer,"");
			sprintf(echoBuffer,"%d %d %d %d",garfo,idf,ACK,rel);
//			printf("Sou externo e vou fazer broadcast dessa mensagem %s\n",echoBuffer);
			
			sleep(1);
			int k=1;
			for(k = 1; k<NUM_PROCS; k++) {	
				cria_cliente(vetorPortas[k],echoBuffer);
			}
			
			//Atualiza o relógio 
			relogio++;
			rel = max(relogio, rel);
			mens_ext->rel=rel;
			
			//Teste de verificacao da fila
// 			printf("----fila----\n");
// 			imprimeFila(q_ext);
// 			printf("----fila----\n");
			
		}
		else if(mens_ext->msg == REQP) {
			//Insere o nodo na fila de requisicoes
			mens_ext->msg = POP;
			insere(q_ext,mens_ext);
			printf("CHEGOU!\n");
			//printf("Sou externo e vou inserir essa mensagem na fila %d %d %d\n", mens_ext->idf, mens_ext->msg, mens_ext->rel);
			
			//Broadcast para todos os outros
			sprintf(echoBuffer,"");
			sprintf(echoBuffer,"%d %d %d %d",garfo,idf,POP,rel);
// 			printf("Sou externo e vou fazer broadcast dessa mensagem %s\n",echoBuffer);
			
			sleep(1);
			int k;
			for(k = 1; k<NUM_PROCS; k++) {
				cria_cliente(vetorPortas[k],echoBuffer);
			}
			
			//Atualiza o relogio
			relogio++;
			rel = max(relogio, rel);
			mens_ext->rel=rel;
			
			//Teste de verificacao da fila
// 			printf("----fila----\n");
// 			imprimeFila(q_ext);
// 			printf("----fila----\n");
		     
		     }
		     else if(mens_ext->msg == REQV){
			    
			    
		            //Insere o nodo na fila de requisicoes
			    mens_ext->msg = VOP;
			    insere(q_ext,mens_ext);
			    //printf("Sou externo e vou inserir essa mensagem na fila %d %d %d\n", mens_ext->idf, mens_ext->msg, mens_ext->rel);
			    
			    //Broadcast para todos os outros
			    sprintf(echoBuffer,"");
			    sprintf(echoBuffer,"%d %d %d %d",garfo,idf,VOP,rel);
// 			    printf("Sou externo e vou fazer broadcast dessa mensagem %s\n",echoBuffer);
			    
			    sleep(1);
			    int k;
			    for(k = 1; k<NUM_PROCS; k++) {
				    cria_cliente(vetorPortas[k],echoBuffer);
			    }
			    
			    //Atualiza o relogio
			    relogio++;
			    rel = max(relogio, rel);
			    mens_ext->rel=rel;
			
			    //Teste de verificacao da fila
// 			    printf("----fila----\n");
// 			    imprimeFila(q_ext);
// 			    printf("----fila----\n");
			  }
			  else 
			  {
			    printf("Recebi ACK!\n");  
			    limpaFila(q_ext);
			      
			  };
		
	}	
}