void solve(Triangulation DT, Segment rect[],vector<Point> points) { map<TP,double> vertex_dist; for (vertex_iterator vit = DT.finite_vertices_begin();vit!=DT.finite_vertices_end();vit++) { TP vertex_p = vit->point(); double min_dist = min_segment(rect, vertex_p); vertex_dist[vertex_p] = min_dist; } for(Edge_iterator eit= DT.finite_edges_begin(); eit!=DT.finite_edges_end();eit++) { double min_dist = CGAL::to_double(DT.segment(eit).squared_length()/4); TP vertex_p1 = eit->first->vertex(DT.cw(eit->second))->point(); TP vertex_p2 = eit->first->vertex(DT.ccw(eit->second))->point(); vertex_dist[vertex_p1] = std::min(vertex_dist[vertex_p1], min_dist); vertex_dist[vertex_p2] = std::min(vertex_dist[vertex_p2], min_dist); } vector<double> dist; for (std::map<TP,double>::iterator it = vertex_dist.begin();it!= vertex_dist.end(); it++) { dist.push_back(it->second); } sort(dist.begin(),dist.end()); int f,m,l; f = time(dist[0]); m = time(dist[points.size()/2]); l = time(dist[points.size() - 1]); cout<<f<<" "<<m<<" "<<l<<endl; }
int main() { while(true) { int bacteria_count; cin >> bacteria_count; // kill switch for application if(bacteria_count == 0) { break; } // read in boundaries of the dish double left_border, right_border, bottom_border, top_border; cin >> left_border >> bottom_border >> right_border >> top_border; // collect bacteria's center information vector<K::Point_2> bacteria_centers; bacteria_centers.reserve(bacteria_count); for(int i = 0; i < bacteria_count; i++) { double bacteria_x, bacteria_y; cin >> bacteria_x >> bacteria_y; bacteria_centers.push_back(K::Point_2(bacteria_x, bacteria_y)); } // create triangulation Triangulation triang; triang.insert(bacteria_centers.begin(), bacteria_centers.end()); // keep track of the distances for each bacteria map<Triangulation::Point, double> distances; //distances.reserve(bacteria_count); // calculate initial distance: distance between the bacteria and the nearest dish boundary for(Triangulation::Finite_vertices_iterator vertex_iter = triang.finite_vertices_begin(); vertex_iter != triang.finite_vertices_end(); ++vertex_iter) { Triangulation::Point vertex = vertex_iter->point(); distances[vertex] = min( min(vertex.x() - left_border, right_border - vertex.x()), // left/right minimum min(vertex.y() - bottom_border, top_border - vertex.y()) // top/bottom minimum ); distances[vertex] *= distances[vertex]; // square distance as we work with squared ones } // compute distance to other two neighbours and update distance if it is smaller for(Triangulation::Finite_edges_iterator edge_iter = triang.finite_edges_begin(); edge_iter != triang.finite_edges_end(); ++edge_iter) { Triangulation::Vertex_handle vertex1 = edge_iter->first->vertex(triang.cw(edge_iter->second)); Triangulation::Vertex_handle vertex2 = edge_iter->first->vertex(triang.ccw(edge_iter->second)); Triangulation::Point vertex1_point = vertex1->point(); Triangulation::Point vertex2_point = vertex2->point(); // calculate distance of the points of both vertex and half them (divide by 4 as distance is squared and 4 = 2^2) double vertex_distance = CGAL::to_double(CGAL::squared_distance(vertex1_point, vertex2_point)) / 4; // update distances to minimum distances[vertex1_point] = min(distances[vertex1_point], vertex_distance); distances[vertex2_point] = min(distances[vertex2_point], vertex_distance); } // now we know the minimum distance for each bacteria to another one or the borders of the dish // extract distances into a vector and sort it vector<double> only_distances; only_distances.reserve(bacteria_count); for(map<Triangulation::Point, double>::iterator iter = distances.begin(); iter != distances.end(); ++iter) { only_distances.push_back(iter->second); } // sort distances sort(only_distances.begin(), only_distances.end()); // print out information cout << hours(only_distances[0]) << " " << hours(only_distances[bacteria_count/2]) << " " << hours(only_distances[bacteria_count - 1]) << endl; } }