void move_to_free(BinaryTree *tree, Node *root) { if(root->ptr) { if(root->ptr[LEFT]) { move_to_free(tree,root->ptr[LEFT]); } if(root->ptr[RIGHT]) { move_to_free(tree,root->ptr[RIGHT]); } } else { root->ptr = malloc(sizeof *root->ptr * NUM_LINKS); } DELETE_OBJPTR(tree,root); ADD_FREE_NODE(tree,root); }
void mis_permutation::construct(graph_access & G) { inconsistencies = 0; solution_size = 0; free_size = 0; total_size = G.number_of_nodes(); nodes.clear(); tightness.clear(); position.clear(); nodes.resize(total_size); tightness.resize(total_size); position.resize(total_size); onetight_all.init(G.number_of_nodes()); // Insert solution nodes forall_nodes(G, n) { nodes[n] = n; position[n] = n; unsigned int index = G.getPartitionIndex(n); // Maybe implement tightness calculations here if (index == 1) { move_to_solution(n, G); } else { int tight = calculate_tightness(n, G); tightness[n] = tight; if (tight == 0) move_to_free(n, G); else move_to_non_free(n, G); if (tight == 1) onetight_all.insert(n); } } endfor