void IesireDinWaiting5() { if(GetNrX()==0) { sleep(1); test("Verifica4",Verifica(1,0,1,0,0,1)==0); IncNrX(); Signal(m,1); sleep(1); test("Verifica5",Verifica(1,0,2,1,0,0)==0); Leave(m); return; } if(GetNrX()==1) { sleep(1); test("Verifica6",Verifica(1,0,1,1,0,0)==0); IncNrX(); Leave(m); return; } if(GetNrX()==2) { sleep(1); test("Verifica7",Verifica(1,0,0,2,0,0)==0); IncNrX(); Leave(m); return; } }
void* Functie5D(void *params) { sleep(2); Enter(m); sleep(1); test("Verifica8",Verifica(0,0,0,3,0,0)==0); Signal(m,1); sleep(1); test("Verifica9",Verifica(0,0,0,3,0,0)==0); Leave(m); return NULL; }
void* Functie6E(void *params) { sleep(2); Enter(m); sleep(1); test("Verifica9",Verifica(0,0,0,5,0,0)==0); Broadcast(m,0); sleep(1); test("Verifica10",Verifica(0,0,0,5,0,0)==0); Leave(m); return NULL; }
void* Functie6D(void *params) { sleep(1); Enter(m); sleep(2); test("Verifica1",Verifica(1,0,0,0,3,0)==0); Broadcast(m,0); sleep(1); test("Verifica2",Verifica(1,0,3,0,0,0)==0); Wait(m,0); IesireDinWait6(); return NULL; }
void* Functie5C(void *params) { sleep(1); Enter(m); sleep(2); test("Verifica1",Verifica(1,0,0,0,1,1)==0); Signal(m,0); sleep(1); test("Verifica2",Verifica(1,0,1,0,0,1)==0); Signal(m,1); sleep(1); test("Verifica3",Verifica(1,0,2,0,0,0)==0); Wait(m,1); IesireDinWaiting5(); return NULL; }
void IesireDinSignal4() { if(GetNrX()==4) { sleep(1); test("Verifica6",Verifica(1,1,0,4,0,0)==0); IncNrX(); Leave(m); return; } if(GetNrX()==5) { sleep(1); test("Verifica7",Verifica(1,0,0,5,0,0)==0); IncNrX(); Leave(m); return; } }
/*-------------------------------------------------------------------------------*/ int Checa_bipartido ( lista *lista_adjacente, int qtd_vertices ) { int v, *A = malloc ( sizeof (int)*qtd_vertices ), *B = malloc ( sizeof (int)*qtd_vertices ); no * bloquinho = lista_adjacente->primeiro; v = bloquinho[0].vertice; return Verifica ( lista_adjacente, bloquinho[0], A, B, v, 1, 0, 0 ); }
void* Functie4D(void *params) { sleep(1); Enter(m); sleep(2); test("Verifica1",Verifica(1,0,0,0,3,0)==0); Broadcast(m,0); IesireDinSignal4(); return NULL; }
void IesireDinWait4() { if(GetNrX()==0) { sleep(1); test("Verifica2",Verifica(1,1,2,0,0,0)==0); IncNrX(); Wait(m,0); IesireDinWait4(); return; } if(GetNrX()==1) { sleep(1); test("Verifica3",Verifica(1,1,1,1,1,0)==0); IncNrX(); Signal(m,0); IesireDinSignal4(); return; } if(GetNrX()==2) { sleep(1); test("Verifica4",Verifica(1,2,1,2,0,0)==0); IncNrX(); Leave(m); return; } if(GetNrX()==3) { sleep(1); test("Verifica5",Verifica(1,2,0,3,0,0)==0); IncNrX(); Leave(m); return; } }
/*-------------------------------------------------------------------------------*/ int Verifica ( lista *lista_adjacente, no bloquinho, int *A, int *B, int v, int conj1ou2 , int Acount, int Bcount ) { // Se 1 insere no conjunto 1 (A) if ( conj1ou2 == 1 ) { A[ Acount ] = v; // muda de conjunto conj1ou2 = 2; Acount++; } // Senao se 2 insere no conjunto 2 (B) else { if ( conj1ou2 == 2 ) { B[ Bcount ] = v; // muda de conjunto conj1ou2 = 1; Bcount++; } } int achou; no bloquinho_aux; sub_no *bloco = bloquinho.proximo; // percorre os vertices que formam aresta com (u) while ( bloco != NULL ) { achou = Procura_nos_conj ( A, B, bloco->vertice, conj1ou2, Acount, Bcount ); // Se 2 e que o grafo nao e bipartido if ( achou == 2 ) return 0; // Se 0 insere o vertice no outro conjunto if ( achou == 0 ) { bloquinho_aux = Procura_endereco ( lista_adjacente, bloco->vertice ); // Se o retorno da funcao for 0 e que o grafo nao e bipartido if ( Verifica ( lista_adjacente, bloquinho_aux, A, B, bloco->vertice, conj1ou2, Acount, Bcount ) == 0 ) { return 0; } } bloco = bloco->mais; } return 1; }
void IesireDinWait6() { if(GetNrX()==0) { sleep(1); test("Verifica3",Verifica(1,0,2,0,1,0)==0); IncNrX(); Wait(m,0); IesireDinWait6(); return; } if(GetNrX()==1) { sleep(1); test("Verifica4",Verifica(1,0,1,1,2,0)==0); IncNrX(); Broadcast(m,0); sleep(1); test("Verifica5",Verifica(1,0,3,2,0,0)==0); Leave(m); return; } if(GetNrX()==2) { sleep(1); test("Verifica6",Verifica(1,0,2,2,0,0)==0); IncNrX(); Leave(m); return; } if(GetNrX()==3) { sleep(1); test("Verifica7",Verifica(1,0,1,3,0,0)==0); IncNrX(); Leave(m); return; } if(GetNrX()==4) { sleep(1); test("Verifica8",Verifica(1,0,0,4,0,0)==0); IncNrX(); Leave(m); return; } }
int main() { int i; char strEntrada[200000]; No *Raiz; pilha Pilha[10000]; OP = (No*) malloc(sizeof(No)); FILE *arq = fopen("string.in", "r"); fscanf(arq,"%s",strEntrada); criaNo('@', &Raiz); Raiz = criaGrafo(strEntrada, Raiz); DecodificaOperacao(Raiz, Pilha); //for(i = 0; i<1; i++) while(Fim == 0 && Raiz->c != ':' && Raiz->c != '$') { OP = pop(Pilha); switch (OP->c) { case 'S': if(Verifica(3,Pilha, &Raiz)) { S(Pilha, &Raiz); #ifdef CONT_FLAG cont_S++; #endif } break; case 'K': K(Pilha, &Raiz); #ifdef CONT_FLAG cont_K++; #endif break; case 'B': if(Verifica(3,Pilha, &Raiz)) { B(Pilha, &Raiz); #ifdef CONT_FLAG cont_B++; #endif } break; case 'b': if(Verifica(3,Pilha, &Raiz)) { BL(Pilha, &Raiz); #ifdef CONT_FLAG cont_BL++; #endif } break; case 'P': if(Verifica(3,Pilha, &Raiz)) { CL(Pilha, &Raiz); #ifdef CONT_FLAG cont_CL++; #endif } break; case 'I': I(Pilha, &Raiz); #ifdef CONT_FLAG cont_I++; #endif break; case 'W': if(Verifica(3,Pilha, &Raiz)) { SL(Pilha, &Raiz); #ifdef CONT_FLAG cont_SL++; #endif } break; case 'C': if(Verifica(3,Pilha, &Raiz)) { C(Pilha, &Raiz); #ifdef CONT_FLAG cont_C++; #endif } break; case 'H': //Hd Hd(Pilha, &Raiz); break; case 'T': //Tl Tl(Pilha, &Raiz); break; case '*': MULT(Pilha, &Raiz); break; case '/': DIV(Pilha, &Raiz); break; case '-': SUB(Pilha, &Raiz); break; case '+': ADD(Pilha, &Raiz); break; case '^': POT(Pilha, &Raiz); break; default: Fim = 1; break; } } printf("Saida: "); printaGrafo(Raiz); printf("\n"); printf("\nChamadas ao GC:%d\n", garbage); #ifdef CONT_FLAG printf("S: %d\n",cont_S); printf("K: %d\n",cont_K); printf("I: %d\n",cont_I); printf("C: %d\n",cont_C); printf("B: %d\n",cont_B); printf("S': %d\n",cont_SL); printf("C': %d\n",cont_CL); printf("B': %d\n",cont_BL); #endif return 0; }