poj 2187 Beauty Contest(凸包求解多节点的之间的最大距离)

简介:

/*  poj 2187 Beauty Contest
    凸包:寻找每两点之间距离的最大值
    这个最大值一定是在凸包的边缘上的!  
    
    求凸包的算法: Andrew算法! 
*/
#include<iostream> 
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct Point{
   Point(){}
   Point(int x, int y){
      this->x=x;
      this->y=y;
   }
   int x, y;
   
  static int cross(Point a, Point b){
       return a.x*b.y - a.y*b.x;
   }
   
  static int dist(Point a, Point b){
       return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y);
   }
   
   Point operator -(Point tmp){
      return Point(x-tmp.x, y-tmp.y);
   }
};

bool cmp(Point a, Point b){
   if(a.x==b.x)
     return a.y<b.y;
   return a.x<b.x;
}

Point p[50005];
int ch[50005];
int n;

int main(){
   int i;
   while(scanf("%d", &n)!=EOF){
      for(i=0; i<n; ++i)
         scanf("%d%d", &p[i].x, &p[i].y);
      sort(p, p+n, cmp);
      int m=0;
      //求下凸包, 如果某一个点不在线段之内,向量的叉积必定是<=0; 
      for(i=0; i<n; ++i){
         while(m>1 && Point::cross(p[ch[m-1]]-p[ch[m-2]], p[i]-p[ch[m-2]])<=0) m--;
         ch[m++]=i;
      }
      //为啥求上凸包的时候,坐标的从n-2开始:因为n-1点一定是在下凸包中的(因为它的横坐标最大,必然是包含其他节点的) 
      int k=m;
      for(i=n-2; i>=0; --i){
         while(m>k && Point::cross(p[ch[m-1]]-p[ch[m-2]], p[i]-p[ch[m-2]])<=0) m--;
         ch[m++]=i;
      }
      --m;
      int maxD=-1, j, d;
      for(i=0; i<m; ++i)
         for(j=i+1; j<=m; ++j)
             if(maxD < (d=Point::dist(p[ch[i]], p[ch[j]])))
                maxD=d;
      printf("%d\n", maxD);
   }
   return 0;
}

目录
相关文章
|
4月前
没有给出二分图两个左右点集时的二分图最大匹配
没有给出二分图两个左右点集时的二分图最大匹配
12 0
|
25天前
|
算法 测试技术 C#
【图论】 【割点】 【双连通分类】LCP 54. 夺回据点
【图论】 【割点】 【双连通分类】LCP 54. 夺回据点
|
11月前
|
存储 算法 搜索推荐
拓扑排序:求取拓扑序列
拓扑排序简单讲就是在可求拓扑序列的有向无回路图(有向无环图)中求取拓扑序列的排序算法。通俗讲就是按活动的先后次序进行排序的序列,并且每一个顶点只出现一次,它可以表述出完成某一项活动所需要的前置活动
55 0
拓扑排序:求取拓扑序列
最短路模型(二)
AcWing 188. 武士风度的牛
301 0
最短路模型(二)
|
存储 算法
最短路模型(一)
复习acwing算法提高课的内容,本篇为讲解算法:最短路模型,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
107 0
最短路模型(一)
|
Go
[Nowcoder / POJ2728] 最优比率生成树 | 二分 + prim
有n个点,其中,每个点给出位置坐标( x , y ) 以及高度z ,两点之间的距离为两点之间的欧几里得距离 两点之间建立一条路的代价为两点之间的高度差,问将n 个点联通的情况下,求出最大的cost/dis
104 0
|
存储 算法 Java
【每日算法】用树建图,求距离目标节点为 k 的点集的两种方式:「建图 + BFS」&「建图 + 迭代加深」 |Python 主题月
【每日算法】用树建图,求距离目标节点为 k 的点集的两种方式:「建图 + BFS」&「建图 + 迭代加深」 |Python 主题月
|
机器学习/深度学习
【组合数学】递推方程 ( 非齐次部分是 指数函数 且 底是特征根 | 求特解示例 )
【组合数学】递推方程 ( 非齐次部分是 指数函数 且 底是特征根 | 求特解示例 )
130 0
Newton-Raphson切线法解高次方程近似根
Newton-Raphson切线法解高次方程近似根   对于一般的一次,二次方程来说,求解方程的根比较简单。但是对于四次、五次甚至更高次方程,求解方程的f(x)=0的根变得十分困难甚至不可能完成。
1591 0