static int apply_alternating_path(bipartite_t const *const gr, int *const matching, bitset_t *const matched_left, bitset_t *const matched_right) { bool done_something = false; bitset_t *const tmp = bitset_alloca(gr->n_right); for (unsigned left = 0; left < gr->n_left; ++left) { bitset_t *left_adj = gr->adj[left]; bitset_copy(tmp, left_adj); if (matching[left] >= 0) { int old_right = matching[left]; /* Check of all neighbors of the left node are already matched. * We cannot improve this edge then. */ if (bitset_contains(left_adj, matched_right)) continue; bitset_andnot(tmp, matched_right); unsigned right = bitset_next_set(tmp, 0); assert(right != ~0u); /* We have to find another left node which has the old right one as * a neighbor. This node must not be part of a matching */ unsigned i; for (i = 0; i < gr->n_left; ++i) if (i != left && bitset_is_set(gr->adj[i], old_right) && !bitset_is_set(matched_left, i)) break; /* If no such node can be found, exit. */ if (i >= gr->n_left) continue; /* Else, we can improve this edge. */ matching[left] = right; matching[i] = old_right; bitset_set(matched_left, i); bitset_set(matched_right, right); done_something = true; } else { /* We have to create a new single edge */ assert(!bitset_is_set(matched_left, left)); bitset_andnot(tmp, matched_right); if (bitset_is_empty(tmp)) continue; unsigned right = bitset_next_set(tmp, 0); assert(!bitset_is_set(matched_right, right)); matching[left] = right; bitset_set(matched_left, left); bitset_set(matched_right, right); done_something = true; } } return done_something; }
static void setclear(){ int i; bitset_t set=bitset_create(16,16); printf("setting 5 and 60\n"); bitset_set(set,5); bitset_set(set,60); for(i=0;i<80;i++) printf("%s",bitset_test(set,i)?"1":"0"); printf("\n"); int N=10; printf("%d in set is %d\n",N,bitset_test(set,N)); printf("set %d\n",N); bitset_set(set,N); printf("%d in set is %d\n",N,bitset_test(set,N)); printf("clear %d\n",N); bitset_clear(set,N); printf("%d in set is %d\n",N,bitset_test(set,N)); N=100; printf("%d in set is %d\n",N,bitset_test(set,N)); printf("set %d\n",N); bitset_set(set,N); printf("%d in set is %d\n",10,bitset_test(set,10)); printf("%d in set is %d\n",N,bitset_test(set,N)); printf("clear %d\n",N); bitset_clear(set,N); printf("%d in set is %d\n",N,bitset_test(set,N)); N=200; printf("%d in set is %d\n",N,bitset_test(set,N)); bitset_fprint(stdout,set); printf("set %d\n",N); bitset_set(set,N); bitset_fprint(stdout,set); printf("%d in set is %d\n",10,bitset_test(set,10)); printf("%d in set is %d\n",N,bitset_test(set,N)); printf("clear %d\n",N); bitset_clear(set,N); printf("%d in set is %d\n",N,bitset_test(set,N)); bitset_fprint(stdout,set); printf("\n"); N=1000000; printf("%d in set is %d\n",N,bitset_test(set,N)); printf("set %d\n",N); bitset_set(set,N); printf("%d in set is %d\n",10,bitset_test(set,10)); printf("%d in set is %d\n",N,bitset_test(set,N)); printf("clear %d\n",N); bitset_clear(set,N); printf("%d in set is %d\n",N,bitset_test(set,N)); N=10000; printf("%d in set is %d\n",N,bitset_test(set,N)); printf("set %d\n",N); bitset_set(set,N); printf("%d in set is %d\n",10,bitset_test(set,10)); printf("%d in set is %d\n",N,bitset_test(set,N)); printf("clear %d\n",N); bitset_clear(set,N); printf("%d in set is %d\n",N,bitset_test(set,N)); printf("setting 5 and 60\n"); bitset_set(set,5); bitset_set(set,60); for(i=0;i<80;i++) printf("%s",bitset_test(set,i)?"1":"0"); printf("\n"); N=1222333; printf("set %d\n",N); bitset_set(set,N); printf("set:{"); for(element_t e=0;bitset_next_set(set,&e);e++){ printf(" %u",e); } printf(" }\n"); bitset_destroy(set); }