/** * Eliminate a cycle of the given flow in the given set of paths. * @param path Set of paths containing the cycle. * @param cycle_begin Part of the cycle to start at. * @param flow Flow along the cycle. */ void MCF1stPass::EliminateCycle(PathVector &path, Path *cycle_begin, uint flow) { Path *cycle_end = cycle_begin; do { NodeID prev = cycle_begin->GetNode(); cycle_begin->ReduceFlow(flow); cycle_begin = path[cycle_begin->GetNode()]; Edge edge = this->job[prev][cycle_begin->GetNode()]; edge.RemoveFlow(flow); } while (cycle_begin != cycle_end); }
/** * Eliminate a cycle of the given flow in the given set of paths. * @param path Set of paths containing the cycle. * @param cycle_begin Part of the cycle to start at. * @param flow Flow along the cycle. */ void MCF1stPass::EliminateCycle(PathVector &path, Path *cycle_begin, uint flow) { Path *cycle_end = cycle_begin; do { NodeID prev = cycle_begin->GetNode(); cycle_begin->ReduceFlow(flow); if (cycle_begin->GetFlow() == 0) { PathList &node_paths = this->job[cycle_begin->GetParent()->GetNode()].Paths(); for (PathList::iterator i = node_paths.begin(); i != node_paths.end(); ++i) { if (*i == cycle_begin) { node_paths.erase(i); node_paths.push_back(cycle_begin); break; } } } cycle_begin = path[prev]; Edge edge = this->job[prev][cycle_begin->GetNode()]; edge.RemoveFlow(flow); } while (cycle_begin != cycle_end); }