题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=450

You are to write a program to find a circle which covers a set of points and has the minimal area. There will be no more than 100 points in one problem.

题意描述:找到一个最小圆能够包含到所有的二维坐标点。

算法分析:最小覆盖圆的做法。

 //最小覆盖圆
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define inf 0x7fffffff
#define exp 1e-10
#define PI 3.141592654
using namespace std;
const int maxn=+;
struct Point
{
double x,y;
Point(double x=,double y=):x(x),y(y){}
}an[maxn],d;//d:最小覆盖圆的圆心坐标
double r;//最小覆盖圆的半径
typedef Point Vector;
Vector operator + (Vector A,Vector B) {return Vector(A.x+B.x , A.y+B.y); }
Vector operator - (Vector A,Vector B) {return Vector(A.x-B.x , A.y-B.y); }
Vector operator * (Vector A,double p) {return Vector(A.x*p , A.y*p); }
Vector operator / (Vector A,double p) {return Vector(A.x/p , A.y/p); }
int dcmp(double x)
{
if (fabs(x)<exp) return ;
return x< ? - : ;
}
double cross(Vector A,Vector B)
{
return A.x*B.y-B.x*A.y;
}
double dist(Vector A,Vector B)
{
double x=(A.x-B.x)*(A.x-B.x);
double y=(A.y-B.y)*(A.y-B.y);
return sqrt(x+y);
} void MiniDiscWith2Point(Point p,Point q,int n)
{
d=(p+q)/2.0;
r=dist(p,q)/;
int k;
double c1,c2,t1,t2,t3;
for (k= ;k<=n ;k++)
{
if (dist(d,an[k])<=r) continue;
if (dcmp(cross(p-an[k],q-an[k]))!=)
{
c1=(p.x*p.x+p.y*p.y-q.x*q.x-q.y*q.y)/2.0;
c2=(p.x*p.x+p.y*p.y-an[k].x*an[k].x-an[k].y*an[k].y)/2.0;
d.x=(c1*(p.y-an[k].y)-c2*(p.y-q.y))/((p.x-q.x)*(p.y-an[k].y)-(p.x-an[k].x)*(p.y-q.y));
d.y=(c1*(p.x-an[k].x)-c2*(p.x-q.x))/((p.y-q.y)*(p.x-an[k].x)-(p.y-an[k].y)*(p.x-q.x));
r=dist(d,an[k]);
}
else
{
t1=dist(p,q);
t2=dist(q,an[k]);
t3=dist(p,an[k]);
if (t1>=t2 && t1>=t3)
{
d=(p+q)/2.0;
r=dist(p,q)/2.0;
}
else if (t2>=t1 && t2>=t3)
{
d=(an[k]+q)/2.0;
r=dist(an[k],q)/2.0;
}
else
{
d=(an[k]+p)/2.0;
r=dist(an[k],p)/2.0;
}
}
}
}
void MiniDiscWithPoint(Point p,int n)
{
d=(p+an[])/2.0;
r=dist(p,an[])/2.0;
int j;
for (j= ;j<=n ;j++)
{
if (dist(d,an[j])<=r) continue;
else
{
MiniDiscWith2Point(p,an[j],j-);
}
}
} int main()
{
int n;
while (scanf("%d",&n)!=EOF && n)
{
for (int i= ;i<=n ;i++)
{
scanf("%lf%lf",&an[i].x,&an[i].y);
}
if (n==)
{
printf("%lf %lf\n",an[].x,an[].y);
continue;
}
r=dist(an[],an[])/2.0;
d=(an[]+an[])/2.0;
for (int i= ;i<=n ;i++)
{
if (dist(d,an[i])<=r) continue;
else
MiniDiscWithPoint(an[i],i-);
}
printf("%.2lf %.2lf %.2lf\n",d.x,d.y,r);
}
return ;
}

zoj 1450 Minimal Circle 最小覆盖圆的更多相关文章

  1. HDU 3007 Buried memory & ZOJ 1450 Minimal Circle

    题意:给出n个点,求最小包围圆. 解法:这两天一直在学这个神奇的随机增量算法……看了这个http://soft.cs.tsinghua.edu.cn/blog/?q=node/1066之后自己写了好久 ...

  2. ZOJ 1450 Minimal Circle 最小圆覆盖

    套了个模板直接上,貌似没有随机化序列 QAQ //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #in ...

  3. Maple trees(最小覆盖圆)

    Maple trees Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...

  4. [hdu-3007]Buried memory 最小覆盖圆

    大致题意: 平面上有n个点,求一个最小的圆覆盖住所有点 最小覆盖圆裸题 学习了一波最小覆盖圆算法 #include<cstdio> #include<iostream> #in ...

  5. ZOJ1450 Minimal Circle 最小圆覆盖

    ZOJ1450 给定N个点(N<=100)求最小的圆把这些点全部覆盖 考虑对于三角形,可以唯一的找到外接圆,而多边形又可以分解为三角形,所以对于多边形也可以找到唯一的最小覆盖圆. #includ ...

  6. ZOJ1450 Minimal Circle

    You are to write a program to find a circle which covers a set of points and has the minimal area. T ...

  7. hdu 2215 & hdu 3932(最小覆盖圆)

    Maple trees Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. [LeetCode] Generate Random Point in a Circle 生成圆中的随机点

    Given the radius and x-y positions of the center of a circle, write a function randPoint which gener ...

  9. Judge Route Circle --判断圆路线

    Initially, there is a Robot at position (0, 0). Given a sequence of its moves, judge if this robot m ...

随机推荐

  1. zend studio导入thinkphp的乱码问题

    刚刚导入thinkphp有乱码还有错误怎么办? windows -> preference -> Work space -> text file encodeing设置为 UTF-8 ...

  2. 通过HttpClient方式连接网络

    xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...

  3. Simple Shopping Cart By AngularJS

    <body ng-controller='CartController'> <h1>Your Order</h1> <div ng-repeat='item ...

  4. 访问svc 文件,编译器错误消息: CS0016,未能写入输出文件

    编译错误              说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码.             编译器错误消息: CS0016: 未 ...

  5. MVC 区分是哪按键提交FORM

    原理: 引用model(@model modelName)的画面,提交到后台的model对象,属性与前台post标签name属性对应来获取值. 前台: @model myModel @using(Ht ...

  6. R语言的日期运算

    写hive SQL查询, 需要从导入的参数, 自动累加日期. 从而实现一个自动的,多个日期的统计过程 R语言的日期运算超级简单. > test<-Sys.Date() > test ...

  7. STM32F0xx_TIM输入捕获(计算频率)配置详细过程

    前言 关于STM32的定时器,可谓是功能强大,估计没有多少人研究完STM32定时器的所有功能(包括我也没有),只是使用常用的一些功能,后续我会推出关于STM32定时器的更多功能. STM32芯片多数为 ...

  8. 【微网站开发】之微信内置浏览器API使用

    最近在写微网站,发现了微信内置浏览器的很多不称心的地方: 1.安卓版的微信内浏览器底部总是出现一个刷新.前进.后退的底部栏,宽度很大,导致屏幕显示尺寸被压缩 2.分享当前网站至朋友圈时,分享的图片一般 ...

  9. [JAVA][RCP] Eclipse4/RCP/Lifecycle

    E4AP provides two levels of lifecycles, for contributions and for the application. Contents [hide]  ...

  10. hdu 4417 Super Mario/树套树

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意很简单,给定一个序列求一个区间 [L, R,]中小于等于H的元素的个数. 好像函数式线段树可 ...