Poj1228 Grandpa's Estate

原创 2016年06月01日 20:40:29

给出了一些凸包上的点,问该凸包是否为稳定凸包。
稳定凸包即指在不删掉当前凸包上的点的情况下,无法通过加点来得到更大的凸包。这样的凸包每条边上除两端点外都一定还有点。
求出凸包顶点,判断凸包每条边上是否还有点即可。
既然那么多人都写Graham,那我就写写分治来愉悦一下吧。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 1005;
#define EPS 1e-6
#define INF 1e9
struct point {
    double x,y;
    point(){}
    point(double _x,double _y):x(_x),y(_y){}
    point operator - (const point &a) {return point(x-a.x,y-a.y);}
    bool operator != (const point &a) {return x!=a.x || y!=a.y;}
    bool operator == (const point &a) {return x==a.x && y==a.y;}
};
double multi(point a,point b) {return a.x*b.y - a.y*b.x;}
double dis(point a,point b) {point c=a-b;return sqrt(1.0*c.x*c.x+1.0*c.y*c.y);}
bool cmp(point a,point b) {return a.x < b.x || (a.x==b.x && a.y < b.y);}
point P[maxn],hull[maxn];
int N,cnt=0;
double s[maxn];
void quickhull(int L,int R,point a,point b) {
    int x = L,i=L-1,j=R+1;
    for(int k = L; k <= R; k++) if( s[k]-s[x] > EPS || ( fabs(s[x]-s[k])<EPS && cmp(P[x],P[k]))) x=k;
    point y = P[x];
    for(int k = L; k <= R; k++) {
        s[++i] = multi(a-P[k],y-P[k]);
        if( s[i] > EPS) swap(P[i],P[k]); else i--;
    }
    for(int k = R; k >= L; k--) {
        s[--j] = multi(y-P[k],b-P[k]);
        if( s[j] > EPS) swap(P[j],P[k]); else j++;
    }
    if( L <= i ) quickhull(L,i,a,y);
    hull[++cnt] = y;
    if( j <= R ) quickhull(j,R,y,b);
}
bool judge(point a,point b,point k) {
    return fabs(multi(k-a,b-a)) < EPS;
}
int main() {
    int T;
    for(scanf("%d",&T);T;T--) {
        scanf("%d",&N);
        memset(s,0,sizeof s);
        P[0] = point(INF,INF); int x = 0;
        for(int i = 1; i <= N; i++) {
            scanf("%lf%lf",&P[i].x,&P[i].y);
            if( cmp(P[i],P[x]) ) x=i;
        }
        if(N< 5) {puts("NO"); continue;}
        swap(P[1],P[x]);

        cnt=0;
        hull[++cnt] = P[1];
        quickhull(2,N,P[1],P[1]);
        hull[++cnt] = P[1];
        bool fg = 1;
        for(int i = 2; i <= cnt; i++) {
            point a = hull[i-1];
            point b = hull[i];
            bool found=0;
            for(int j = 1; j <= N; j++){
                if(P[j] == a || P[j] == b) continue;
                if(judge(a,b,P[j])) {found=1;break;}
            }
            if( !found ){ fg = 0; break;}
        }
        puts( fg ? "YES" : "NO");

    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ1228 Grandpa's Estate

题目: http://poj.org/problem?id=1228 题意: 给一堆点,是原凸包边上的点或内部的点(内部的点表明凸包被切割); 问能这些点能否唯一确定原来这个凸包 分析: ...
  • jerry99s
  • jerry99s
  • 2018年01月25日 14:34
  • 24

poj1228 - Grandpa's Estate

想看更多的解题报告:http://blog.csdn.net/wangjian8006/article/details/7870410                                ...
  • wangjian8006
  • wangjian8006
  • 2012年08月27日 10:18
  • 2466

Grandpa's Estate(判断是否有点在凸包边上)

题目地址      http://poj.org/problem?id=1228                                                           ...
  • x_y_q_
  • x_y_q_
  • 2016年07月27日 00:27
  • 566

poj1228 Grandpa's Estate 凸包

DescriptionBeing the only living descendant of his grandfather, Kamran the Believer inherited all of...
  • xtulollipop
  • xtulollipop
  • 2015年08月07日 20:49
  • 515

poj1228 Grandpa's Estate(凸包)

poj1228题目给你一些肯定在凸包上的点,问这些点构成的凸包是不是稳定的凸包。思路稳定凸包的话每条边上至少三个给定点。代码#include #include #include #include...
  • pibaixinghei
  • pibaixinghei
  • 2016年09月27日 14:30
  • 163

POJ 1228:Grandpa's Estate (稳定凸包)

Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...
  • qq_28954601
  • qq_28954601
  • 2016年09月21日 20:48
  • 305

poj-1228 Grandpa's Estate(判断凸包是否唯一)

题目链接:点击打开链接 Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Su...
  • acm_cxq
  • acm_cxq
  • 2016年05月06日 00:32
  • 697

[POJ1228]Grandpa's Estate(凸包)

题目描述传送门 题意:给出凸包上的一些点,问是否能唯一确定一个凸包题解很显然能确定唯一凸包的条件是凸包上的每一条边上都至少有三个点 求出凸包之后根据叉积判断就行了 至少有三个顶点 每条边上至少有三...
  • Clove_unique
  • Clove_unique
  • 2017年01月03日 11:39
  • 179

[POJ1228]Grandpa's Estate(计算几何-凸包)

题目: 我是超链接 题意: 给定一些凸包上的点,问能否确定唯一凸包 题解: 如何确定呢?三点确定一条直线,我们只要知道凸包上每一条边都有至少三个点就好了,而且顶点至少是三个啊 那我们先...
  • Blue_CuSO4
  • Blue_CuSO4
  • 2018年01月18日 20:39
  • 38

Grandpa's Estate(poj1228稳定的凸包)

题意:给你一个凸包的所有的点,求看其是否能组成唯一的凸包 思路:组成唯一的凸包,那么他的每一条边至少有三个点,因为如果有有两个点,那么可以再加一个点使得凸包扩大,所以每条边至少三个点。 这就和以前...
  • leonharetd
  • leonharetd
  • 2013年10月09日 20:23
  • 755
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Poj1228 Grandpa's Estate
举报原因:
原因补充:

(最多只允许输入30个字)