/** * Finds the subset that @a set is member of. * @param[in] set Set. * @param[out] diset Diset. * @return @a set subset. */ piojo_diset_sid_t piojo_diset_find(piojo_diset_sid_t set, const piojo_diset_t *diset) { tree_t *dtree; PIOJO_ASSERT(diset); dtree = find_subset(set, diset); return dtree->parent; }
static tree_t* find_subset(piojo_diset_sid_t set, const piojo_diset_t *diset) { tree_t *dtree; dtree = (tree_t*) piojo_hash_search(&set, diset->trees); if (dtree->parent == set){ return dtree; } return find_subset(dtree->parent, diset); }
/** * Joins two sets in diset. * @param[in] set1 Set. * @param[in] set2 Set. * @param[out] diset Diset. */ void piojo_diset_union(piojo_diset_sid_t set1, piojo_diset_sid_t set2, piojo_diset_t *diset) { tree_t *dtree1, *dtree2; PIOJO_ASSERT(diset); dtree1 = find_subset(set1, diset); dtree2 = find_subset(set2, diset); if (dtree1->parent != dtree2->parent){ if (dtree1->rank < dtree2->rank){ dtree1->parent = dtree2->parent; }else if(dtree1->rank > dtree2->rank){ dtree2->parent = dtree1->parent; }else{ dtree2->parent = dtree1->parent; ++dtree1->rank; } } }
int main() { int a[] = {1, 2, 3 ,4}; int i, j =0; for(i=0;i<4;i++) { use[i]=0; } for(i=1;i<=4;i++) { find_subset(a, 4, i, j, 0); } return 0; }
int find_all (int m, int n, char input[][n], char result[][n]) { int i = 0; trienode *root = newnode (0); for (i=0; i<m; i++) { Insert (root, input[i]); int index = 0; for (i=0; i<ALPHABET_SIZE; i++) { if (root->children[i]) { find_subset (root->children[i], n, &index, 0, result); } } return; }
find_subset (trienode *root, int n, int *index, int level, char result[][n]) { result[*index][level] = root->c; if (root->isLeaf) { result[*index][level+1] = '\0'; *index++; return; } for (i=0; i<ALPHABET_SIZE; i++) { if (root->children[i]) { find_subset (root->children[i], n, index, level+1, result); } } return; }
void find_subset(int *a, int n, int size, int curr, int start) { int i; if(curr == size) { print_array(a); return; } else { for(i=start;i<(n);i++) { if(use[i] == 0) { use[i]=1; find_subset(a, n, size, curr+1, i+1); use[i]=0; } } } }
void find_subset(int k , int begin, int end, vector<int>& nums){ if(begin + k -1 > end) return; if(k < 0) return; if(k == 0){ subset_Dup.push_back(subset); return 0; } int i = begin; while(nums[i] == nums[begin]) i++; for(int j = 0; j <= i-begin ; i++){ if(j > 0) subset.push_back(nums[begin]); find_subset(k - j, i, end, nums); } for(int j = 0; j < i-begin ; i++) subset.pop_back(); return; }