题目链接: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. c# await 关键字错误

    private void OnUnlockCommand(object parameter) {    StorageFile file = await Windows.Storage.Applica ...

  2. cmd中无法运行svn命令

    Svn 不是内部或外部命令,也不是可运行的程序 解决方法: 增加“svn安装目录/bin”,例如:C:\Program Files\TortoiseSVN\bin

  3. compareTo & toString

    public class UnAssignedRecord implements Comparable<UnAssignedRecord> { private String time; / ...

  4. 一款jQuery实现重力弹动模拟效果特效,弹弹弹,弹走IE6

    一款jQuery实现重力弹动模拟效果特效 鼠标经过两块黑色div中间的红色线时,下方的黑快会突然掉落, 并在掉落地上那一刻出现了弹跳的jquery特效效果,非常不错,还兼容所有的浏览器, 适用浏览器: ...

  5. php使用base64加密解密图片

    php使用base64加密解密图片的实例代码. 例子: <?php //文件名:base64.php $data="/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAB ...

  6. VPS centos 6 安装图形界面

    在某种场合之下,我们使用的Linux还是要选择安装桌面环境的,所以在这里介绍一下如何给没有安装桌面环境的系统安装桌面环境.以Centos 6.5 为例演示一下如何安装桌面环境. 工具/原料 Linux ...

  7. redis安装与php扩展

    redis安装:就是一个解压缩的过程 注意先运行:redis-server.exe,在运行redis-cli.exe. php扩展redis. 以上是如何选择相应的文件. 在把文件放在php/ext下 ...

  8. ADO.NET 结构 集中数据库联接结构

    MSDN 原文出处 https://msdn.microsoft.com/zh-cn/library/27y4ybxw.aspx .NET Framework 4.6 and 4.5 其他版本 以前, ...

  9. 为啥 Objective-C 使用中括号来调用类方法?

    原因在这篇文章中:http://stackoverflow.com/questions/23723838/why-does-objective-c-use-square-brackets-for-me ...

  10. 几道华为经典C语言面试题

    1.找错 void test1() { char string[10]; char* str1="0123456789"; strcpy(string, str1); } 这里st ...