<题目链接>

<转载于  >>> >

首先来了解什么是稳定的凸包。比如有4个点:

这四个点是某个凸包上的部分点,他们连起来后确实还是一个凸包。但是原始的凸包可能不是这样。

比如:

即这四个点构成的凸包不算做“稳定”的。我们发现,当凸包上存在一条边上的点只有端点两个点的时候,这个凸包不是稳定的,因为它可以在这条边外再引入一个点,构成一个新的凸包。但一旦一条边上存在三个点,那么不可能再找到一个点使它扩展成一个新的凸包,否则构成的新多边形将是凹的。

下面是一个典型的稳定凸包:

于是此题的做法就很明确了,就是在给出的点中,找到凸包,并且判断这个凸包是不是每条边至少有三个点。

 #include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define eps 1e-8
using namespace std; struct point{
double x,y;
};
point p[],stack[];
int N,top;
double multi(point p1, point p2, point p3){ //向量(p1->p2)^(p1->p3)
return (p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x);
}
double dis(point a, point b){
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
int cmp(const void *a, const void *b){ //按极角排序
point c = *(point *)a;
point d = *(point *)b;
double k = multi(p[], c, d);
if(k < || (!k && dis(c, p[]) > dis(d, p[]))) return ;
return -;
}
void Convex(){ //凸包的构建 Andrew算法
for(int i = ; i < N; i++){ //先按x,y坐标排序,找到原点
point temp;
if(p[i].y < p[].y || ( p[i].y == p[].y && p[i].x < p[].x)){
temp = p[i];
p[i] = p[];
p[] = temp;
}
}
qsort(p + , N - , sizeof(p[]), cmp); //再将除原点以外的点按极角排序
stack[] = p[]; //先将起始的两个点压入栈内,在进行后面的判断
stack[] = p[];
top = ;
for(int i = ; i < N; i++){
while(top >= && multi(stack[top - ], stack[top], p[i]) < )top--; //共线的点也压入凸包内;
top++;
stack[top] = p[i];
}
}
bool judge(){ //这个函数是关键
for(int i=;i<top;i++){
if((multi(stack[i-],stack[i+],stack[i]))!=&&(multi(stack[i],stack[i+],stack[i+]))!=) //判断每条边是否有至少三个点,即判断i-1,i,i+1这三个点是否在一条直线上或者i,i+1,i+2是否在一条直线上
return false;
}
return true;
}
int main(){
int t;
cin>>t;
while(t--){
cin>>N;
for(int i=;i<N;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
if(N<)puts("NO");
else{
Convex();
if(judge())puts("YES");
else puts("NO");
}
}
return ;
}

2018-08-23

POJ 1228 (稳定凸包问题)的更多相关文章

  1. poj 1228 稳定凸包

    Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12337   Accepted: 3451 ...

  2. Grandpa's Estate - POJ 1228(稳定凸包)

    刚开始看这个题目不知道是什么东东,后面看了大神的题解才知道是稳定凸包问题,什么是稳定凸包呢?所谓稳定就是判断能不能在原有凸包上加点,得到一个更大的凸包,并且这个凸包包含原有凸包上的所有点.知道了这个东 ...

  3. POJ 1228 - Grandpa's Estate 稳定凸包

    稳定凸包问题 要求每条边上至少有三个点,且对凸包上点数为1,2时要特判 巨坑无比,调了很长时间= = //POJ 1228 //稳定凸包问题,等价于每条边上至少有三个点,但对m = 1(点)和m = ...

  4. POJ 1228 Grandpa's Estate 凸包 唯一性

    LINK 题意:给出一个点集,问能否够构成一个稳定凸包,即加入新点后仍然不变. 思路:对凸包的唯一性判断,对任意边判断是否存在三点及三点以上共线,如果有边不满足条件则NO,注意使用水平序,这样一来共线 ...

  5. 凸包稳定性判断:每条边上是否至少有三点 POJ 1228

    //凸包稳定性判断:每条边上是否至少有三点 // POJ 1228 #include <iostream> #include <cstdio> #include <cst ...

  6. POJ 1228 Grandpa's Estate --深入理解凸包

    题意: 判断凸包是否稳定. 解法: 稳定凸包每条边上至少有三个点. 这题就在于求凸包的细节了,求凸包有两种算法: 1.基于水平序的Andrew算法 2.基于极角序的Graham算法 两种算法都有一个类 ...

  7. POJ 1228 Grandpa's Estate(凸包)

    Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11289   Accepted: 3117 ...

  8. ●POJ 1228 Grandpas Estate

    题链: http://poj.org/problem?id=1228 题解: 计算几何,凸包 题意:给出一些点,求出其凸包,问是否是一个稳定的凸包. 稳定凸包:不能通过新加点使得原来凸包上的点(包括原 ...

  9. poj 3348 Cow 凸包面积

    Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8122   Accepted: 3674 Description ...

随机推荐

  1. css 背景图片自适应元素大小

    一.一种比较土的方法,<img>置于底层. 方法如下: CSS代码: HTML: <img src="背景图片路径" /> <span>字在背景 ...

  2. ES系列十六、集群配置和维护管理

    一.修改配置文件 1.节点配置 1.vim elasticsearch.yml # ======================== Elasticsearch Configuration ===== ...

  3. mysql系列十三、mysql中replace into和duplicate key的使用区

    一.创建测试表 1.创建唯一索引"b" CREATE TABLE `test2` ( `id` int(10) NOT NULL AUTO_INCREMENT, `a` varch ...

  4. openstack常见问题解决方法总结

    一.创建实例失败: 首先用下面命令查看服务是否正常 1. nova-manage service list 如果不正常,则使用下面命令重启,如果还不行,则查看日志, 1. service nova-a ...

  5. maven配置文件setting.xml

    1.Maven本地仓库<localRepository>D:\DevTools\maven_Analytics\mavenrepo</localRepository> 2.网络 ...

  6. nagios监控客户端报错/usr/bin/perl^M: bad interpreter: No such file or directory

    nagios服务端监控客户端内存时发现监控不上 在客户端直接执行脚本,报错如下: # /usr/local/nagios/libexec/check_memory.pl -w 6% -c 3% -ba ...

  7. win7设置固定IP

    正文: 你必须知道你的路由器网关,一般是192.168.1.1(或192.168.0.1) 按传统的来:开始——控制面板——网络和共享中心——更改适配器设置.一般来讲,这里应该有两个图标,一个是有线网 ...

  8. Ex 6_1 和最大的相连子序列..._第五次作业

    设数值列表a0,a1 . . . an存放在数组arr[0. . .n]中. sum[0],sum[1],sum[2] . . . .sum[n]为以该下标为终点元素的连续子序列的和的最大值,则sum ...

  9. 通用jsonp跨域技术获取天气数据

    1. 前言 在进行网站开发的过程中经常会用到第三方的数据,但是由于同源策略的限制导致ajax不能发送请求,因此也无法获得数据.解决ajax的跨域问题可以使用jsonp技术 2.代码 <!DOCT ...

  10. 安装sass报错

    ERROR in Cannot find module 'node-sass' 执行:npm install sass-loader node-sass webpack --save-dev即可