//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); }
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"); }
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."); } }
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); }; } }