void printOid(gss_OID oidElem) { OBJECT_IDENTIFIER_t *objId = NULL; asn_dec_rval_t ret; int b64len; char *b64; int r; b64len = Base64encode_len(oidElem->length); b64 = (char *)malloc(sizeof(char) * b64len); r = Base64encode(b64, (char *)(oidElem->elements), oidElem->length); // ret = asn_DEF_OBJECT_IDENTIFIER.ber_decoder(0, &asn_DEF_OBJECT_IDENTIFIER, &objId, oidElem->elements, oidElem->length,0); //if(ret.code != RC_OK) { // printf("\n**COULD NOT CREATE OID**\n"); // } print_arcs(objId); //free(objId); }
// Recebe um grafo g // Retorna um emparelhamento maximal // Deve ser reexecutado para todo vértice não M-saturado Arcs* hungarian(Graph *g) { int i, j, u; HeaderSet *S = (HeaderSet*) malloc(sizeof(HeaderSet)); HeaderSet *T = (HeaderSet*) malloc(sizeof(HeaderSet)); HeaderSet *NS = (HeaderSet*) malloc(sizeof(HeaderSet)); HeaderSet *X = (HeaderSet*) malloc(sizeof(HeaderSet)); HeaderSet *Y = (HeaderSet*) malloc(sizeof(HeaderSet)); Arcs *M; init_header_set(X); init_header_set(Y); bipartite(g, X, Y); //print_set(X->first); //puts(""); //print_set(Y->first); //puts(""); //getchar(); init_header_set(S); init_header_set(T); init_header_set(NS); M = init_arcs(g->vertex_count); //print_arcs(M); //getchar(); int break_loop = 0; for (i = 0 ; i < g->vertex_count ; i++) { for (j = i ; j < g->vertex_count ; j++) if (g->arcs[i][j] > 0) { insert_arcs(i, j, g->arcs[i][j], M); break_loop = 1; break; } if (break_loop) break; } //print_arcs(M); //getchar(); u = non_saturation_header_set(X, M); printf("u = %d\n", u); while (u >= 0) { int y; insert_header_set(u, S); //print_set(S->first); //puts(""); zero_header_set(T); //print_set(T->first); //puts(""); zero_header_set(NS); //print_set(NS->first); builds_neighborhood_header_set(S, NS, g); //print_set(NS->first); //puts(""); while (!compare_header_set(NS, T, g)) { //* puts("Step 1"); printf("NS nodes: %d\nT nodes: %d\n", NS->nodes, T->nodes); print_set(NS->first); puts("- NS"); print_set(S->first); puts(" - S"); print_set(T->first); puts("- T"); puts(""); getchar(); puts("Step 2"); HeaderSet *asdf = subtraction_header_set(NS, T, g); print_set(asdf->first); puts("- NS\\T"); print_arcs(M); puts("Arestas emparelhadas"); //*/ y = saturation_header_set(subtraction_header_set(NS, T, g), M); printf("Saturation: %d\n", y); if (y < 0) break; insert_header_set(M->arcs[0][y], S); print_set(S->first); puts(" - S"); insert_header_set(y, T); print_set(T->first); puts(" - T"); builds_neighborhood_header_set(S, NS, g); print_set(NS->first); puts(" - NS"); getchar(); } if (compare_header_set(NS, T, g)) break; //return S; else { Arcs* P; P = init_arcs(g->vertex_count); int *visited = (int*) calloc(g->vertex_count, sizeof(int)); y = non_saturation_header_set(subtraction_header_set(NS, T, g), M); puts("Step 3"); printf("Non-saturation: %d\n", y); P = augmenting_path(u, y, M, g, visited); print_arcs(P); puts("Caminho aumentante P"); // Se não existe um caminho aumentante de y para u retorna M if (P == NULL) break; symmetric_difference_arcs(y, P, M); print_arcs(M); puts("Arestas emparelhadas"); getchar(); } u = non_saturation_header_set(X, M); printf("u = %d\n", u); } return M; }