转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents
by---cxlove
题目:求出凸包的最大直径。
http://poj.org/problem?id=2187
先对多边形求凸包,以前的知识不多说。
然后用旋转卡壳求出最大直径。
其实就是两条平行线夹出凸包,旋转。
如果pa,pb为最远点对的话,那么过pa,pb的平行线经过旋转,肯定有一条与多边形的边重合。
利用这点,枚举每一条边,找到离边最远的点,看上去这还是N^2的,和枚举一样。
不过由于是凸多边形,对于某一条边,点到边的距离呈现单峰函数。
那么就可以利用上一条边的最远点依次后移得到。
这篇说得不错:http://www.cnblogs.com/xdruid/archive/2012/07/01/2572303.html
#include<iostream>
#include<fstream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<sstream>
#include<ctime>
#include<cassert>
#define LL long long
#define eps 1e-8
#define inf 999999.0
#define zero(a) abs(a)<eps
#define N 20
#define pi acos(-1.0)
using namespace std;
struct Point{
int x,y;
}p[50005];
int n;
vector<Point >s;
int dist(Point p1,Point p2){
return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);
}
int xmul(Point p0,Point p1,Point p2){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
//Graham_scan求凸包
bool cmp(Point p1,Point p2){
if(xmul(p[0],p1,p2)>eps) return true;
else if(zero(xmul(p[0],p2,p1))&&dist(p[0],p1)<dist(p[0],p2)) return true;
return false;
}
void Graham_scan(){
for(int i=1;i<n;i++)
if(p[i].y<p[0].y||(p[i].y==p[0].y&&p[i].x<p[0].x))
swap(p[i],p[0]);
sort(p+1,p+n,cmp);
s.clear();
s.push_back(p[0]);s.push_back(p[1]);
for(int i=2;i<n;i++){
while(s.size()>=2&&xmul(s[s.size()-2],s[s.size()-1],p[i])<eps) s.pop_back();
s.push_back(p[i]);
}
}
//旋转卡壳求凸包直径
void Rotating_Calipers(){
int ans=0,len=s.size();
int j=1;
s.push_back(s[0]);
for(int i=0;i<len;i++){
//找到离直线最远的点
while(abs(xmul(s[i],s[i+1],s[j+1]))>abs(xmul(s[i],s[i+1],s[j])))
j=(j+1)%len;
ans=max(ans,max(dist(s[i+1],s[j]),dist(s[i],s[j])));
}
printf("%d\n",ans);
}
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
Graham_scan();
Rotating_Calipers();
}
return 0;
}
分享到:
相关推荐
【标题】"POJ2187-Beauty Contest"是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Set of Peking University)。这个竞赛题目通常被用来测试参赛者的算法设计和问题解决能力。 【描述】"北大POJ2187-...
然而,在某些数据集上,如 POJ2187 题目,凸包顶点数较少时,两者差异可能不明显。 总之,凸包模版旋转卡壳算法是一种高效的计算二维点集凸包直径的方法。它通过巧妙地利用了凸包性质和叉积来优化搜索过程,实现了...
标题中的“pku_poj_2187.rar_poj 2187_凸包问题”表明这是一个关于北京大学(Peking University, PKU)编程竞赛平台POJ上的第2187题,题目主要涉及凸包问题。描述中的“O(nlogn)凸包问题 poj2187”提示我们解决这个...
"西北工业大学POJ试题C++答案代码+课程设计"这一标题表明了资源的主要内容,涉及两个核心部分:一是西北工业大学的编程竞赛(POJ,Problem Oriented Judge System)的C++解题代码,二是与这些题目相关的课程设计。...
【标题】"凸包练习: POJ 2187(JAVA)" 是一个关于编程算法的挑战,主要涉及计算机科学中的几何算法。在本问题中,我们关注的是二维平面上的点集及其凸包(Convex Hull)的概念。凸包可以被理解为一个最小的多边形,该...
《POJ1207-The 3n + 1 problem》是北京大学在线编程平台POJ上的一道经典算法题目,其主要涉及的知识点是数论和动态规划。本题目的核心是解决著名的“Collatz Conjecture”问题,也被称为“3n+1猜想”。 3n+1猜想是...
【标题】"POJ1113-Wall【凸包】"所指的是一道来自北京大学在线判题系统POJ的编程题目。该题目主要涉及计算机科学中的算法问题,特别是几何算法中的“凸包”概念。 【描述】"北大POJ1113-Wall【凸包】解题报告+AC...
1011,1012,1013,1014,1015,1017,1026,1028,1032,1035,1041,1046,1129 1149 1154 1165 1182 1185 1190 1191 1201 1251 1273 1275 1276 1286 1322 1338 1363 1364 1401 1456 1459 1564 1579 1637 1657 1658 ...
题目"POJ-2870 Light Up"是一个经典的图论问题,主要涉及深度优先搜索(DFS)算法的运用。该问题要求点亮一个矩形区域内的所有障碍物,每个障碍物需要特定数量的灯光才能被照亮,且相邻的障碍物之间不能有空格。题目...
* 凸包:poj2187, poj1113 中级部分: 一、基本算法 * C++的标准模版库的应用 + poj3096, poj3007 * 较为复杂的模拟题的训练 + poj3393, poj1472, poj3371, poj1027, poj2706 二、图算法 * 差分约束系统的...
这篇博客“学习凸包(三): 凸包练习 POJ 1113”显然是关于如何通过编程解决凸包问题的一个实例。我们将深入探讨这个话题,主要关注凸包的定义、常见的求解算法以及如何用Java实现。 凸包可以被定义为一个给定集合中...
POJ 算法题目分类 POJ 算法题目分类是指分类所有 POJ 题目的算法思想和解决方案,本文将对算法分类进行详细的介绍。 一、基本算法 ...* 凸包:凸包是指解决问题的凸包算法,如 poj2187、poj1113。
在POJ 1696这个编程题目中,很可能需要解决与极角排序相关的问题。POJ(Problem Online Judge)是一个在线的编程竞赛平台,它提供了许多编程题目供参赛者解决,以提升编程能力和算法理解。 描述中提到的“叉积+深搜...
poj题目分类 POJ(Princeton Online Judge)是一個在线编程平台...4. 凸包:例如 poj2187、poj1113。 这些知识点涵盖了算法、数据结构、数学、计算几何学等领域的多个方面,为编程爱好者和学生提供了广泛的知识基础。
《POJ3009-Curling 2.0:深度优先搜索、向量、回溯与剪枝的综合应用》 北京大学在线编程平台上的POJ3009题目名为"Curling 2.0",它是一道涉及到算法与数据结构的复杂问题,主要考察了参赛者对深度优先搜索(DFS)、...
【标题】"POJ3733-Changing Digits【DFS+强剪枝】"是一个来自北京大学在线评测系统POJ的编程题目,该题目主要涉及深度优先搜索(DFS)算法和强剪枝策略。在算法竞赛和编程挑战中,这类问题通常要求参赛者通过编写...
【标题】"北大POJ初级-所有题目AC代码+解题报告" 涉及的知识点主要集中在编程、算法和在线判题系统方面。北京大学(Peking University, 简称PKU)的POJ(Peking University Online Judge)是一个为计算机科学爱好者...
《POJ3026-Borg Maze:BFS与Prim算法的应用解析》 在计算机科学领域,图论是解决问题的重要工具之一,而BFS(广度优先搜索)和Prim算法则是其中的两种经典算法。本篇文章将围绕北大POJ3026题目“Borg Maze”来探讨...
POJ2186-Popular Cows 【Tarjan+极大强连通分量+缩点】 解题报告+AC代码 http://hi.csdn.net/!s/BGDH68 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573
poj上的测室数据,需要的下载........