int partitionner(vector<vector<int> > *edges, int begin, int end, int pivot, vector<vector<int> > graph) { vector<int> tmp = (*edges)[pivot] ; (*edges)[pivot] = (*edges)[end] ; (*edges)[end] = tmp ; int j = begin ; for(int i = begin ; i < end - 1 ; i++) { if( edgeWeight((*edges)[i],graph) <= edgeWeight((*edges)[end],graph) ) { tmp = (*edges)[i] ; (*edges)[i] = (*edges)[j] ; (*edges)[j++] = tmp ; } } tmp = (*edges)[end] ; (*edges)[end] = (*edges)[j] ; (*edges)[j] = tmp ; return j ; }
/*! * \param e An edge of the graph. * \param g The graph. * \return true if some of v's distances actually needed an update; * false if nothing changed. * * Let's call e's source u and e's target v. Update v's distances * using u's distances plus e's weights. * * \sa FloodVisitor, FloodVisitor::vertexDistances_ and EdgeProperty. */ bool FloodVisitor::broadcastDistances(const Edge & e, const Graph & g) { Vertex u = boost::source(e, g); Vertex v = boost::target(e, g); Point edgeWeight(g[e].black, g[e].red, g[e].green); bool insertedNewDistance = false; NonDominatedSet<Point>::iterator udi; for (udi = vertexDistances_[u].begin(); udi != vertexDistances_[u].end(); ++udi) { insertedNewDistance |= vertexDistances_[v].insert(*udi + edgeWeight); } return insertedNewDistance; }