分治化求凸包,请参看:http://128kj.iteye.com/admin/blogs/1748622
POJ 2187题意:
给出一个点集,求两点之间最长的距离的平方,最长距离的两个点一定在凸包上,
首先,将点集凸包化,这样就可以排除了很多点,接下来就是两个for就可以.
下面是AC过代码:
- import java.util.*;
- class Line {//线
- Point p1, p2;
- Line(Point p1, Point p2) {
- this.p1 = p1;
- this.p2 = p2;
- }
- public Point getP1(){
- return p1;
- }
- public Point getP2(){
- return p2;
- }
- public double getLength() {
- double dx = Math.abs(p1.x - p2.x);
- double dy = Math.abs(p1.y - p2.y);
- return Math.sqrt(dx * dx + dy * dy);
- }
- }
- class Point{//点
- double x;
- double y;
- public Point(double x,double y){
- this.x=x;
- this.y=y;
- }
- }
- /*
- * 分治法求凸包
- */
- class QuickTuBao {
- List<Point> pts = null;//点集
- List<Line> lines = new ArrayList<Line>();//点集pts的凸包
- public void setPointList(List<Point> pts) {
- this.pts = pts;
- }
- public QuickTuBao(List<Point> pts){
- this.pts=pts;
- }
- //求凸包,结果存入lines中
- public List<Line> eval() {
- lines.clear();
- if (pts == null || pts.isEmpty()) { return lines; }
- List<Point> ptsLeft = new ArrayList<Point>();//左凸包中的点
- List<Point> ptsRight = new ArrayList<Point>();//右凸包中的点
- //按x坐标对pts排序
- Collections.sort(pts, new Comparator<Point>() {
- public int compare(Point p1, Point p2) {
- if(p1.x-p2.x>0) return 1;
- if(p1.x-p2.x<0) return -1;
- return 0;
- }
- });
- Point p1 = pts.get(0);//最左边的点
- Point p2 = pts.get(pts.size()-1);//最右边的点,用直线p1p2将原凸包分成两个小凸包
- Point p3 = null;
- double area = 0;
- for (int i = 1; i < pts.size(); i++) {
- p3 = pts.get(i);
- area = getArea(p1, p2, p3);//求此三点所成三角形的有向面积
- if (area > 0) {
- ptsLeft.add(p3);
- } else if (area < 0) {
- ptsRight.add(p3);
- }
- }
- d(p1, p2, ptsLeft);//分别求解
- d(p2, p1, ptsRight);
- return lines;
- }
转载于:https://blog.51cto.com/shuaigee/1138504