void LoopReductor::depthFirstSearch(BasicBlock *bb, Vector<BasicBlock*> *ancestors) { ancestors->push(bb); MARK(bb) = true; SortedSLList<Edge*, EdgeDestOrder> successors; for (BasicBlock::OutIterator edge(bb); edge; edge++) successors.add(*edge); for (SortedSLList<Edge*, EdgeDestOrder>::Iterator edge(successors); edge; edge++) { if ((edge->kind() != Edge::CALL) && !edge->target()->isExit()){ if (MARK(edge->target()) == false) { depthFirstSearch(edge->target(), ancestors); } else { if (ancestors->contains(edge->target())) { LOOP_HEADER(edge->target()) = true; BACK_EDGE(edge) = true; bool inloop = false; for (Vector<BasicBlock*>::Iterator member(*ancestors); member; member++) { if (*member == edge->target()) inloop = true; if (inloop) { IN_LOOPS(member)->add(edge->target()->number()); } } } /* GRUIIIIIIIIIK !!! pas performant, mais bon.. */ for (dfa::BitSet::Iterator bit(**IN_LOOPS(edge->target())); bit; bit++) { bool inloop = false; for (Vector<BasicBlock*>::Iterator member(*ancestors); member; member++) { if (member->number() == *bit) inloop = true; if (inloop) { IN_LOOPS(member)->add(*bit); } } } } } } ancestors->pop(); }
void solveSLList(string input, string output, string okfile) { ifstream fin(input); ofstream fout(output); ifstream fok(okfile); int n; fin >> n; SortedSLList <pair<double, double> > v; for(int i = 0 ; i < n ; ++ i) { double st, dr; fin >> st >> dr; v.add(make_pair(dr, st)); } vector <int> ans = baloonSelectionProblem(&v); int sol; fok >> sol; assert(sol == ans.size()); fout << ans.size() << '\n'; for(auto it : ans) fout << v.getAtIndex(it).first << ' ' << v.getAtIndex(it).second << '\n'; }