标签:
增量法最小圆覆盖....


2 1 0 -1 0 0
1.50
/* ***********************************************
Author :CKboss
Created Time :2014年12月29日 星期一 17时19分19秒
File Name :HDOJ2215.cpp
************************************************ */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace std;
const int maxn = 111;
const double eps=1e-8;
int dcmp(double x)
{
if(fabs(x)<eps) return 0;
return x>eps?1:-1;
}
struct Point
{
double x,y;
Point(){}
Point(double _x,double _y) { x=_x; y=_y;}
}pt[maxn];
struct Circle
{
Point c; double r;
Circle(){}
Circle(Point _c,double _r) { c=_c; r=_r; }
};
Point operator+(Point A,Point B) { return Point(A.x+B.x,A.y+B.y); }
Point operator-(Point A,Point B) { return Point(A.x-B.x,A.y-B.y); }
Point operator*(Point A,double p) { return Point(A.x*p,A.y*p); }
Point operator/(Point A,double p) { return Point(A.x/p,A.y/p); }
double Dot(Point A,Point B) { return A.x*B.x+A.y*B.y; }
double Length(Point A) { return sqrt(Dot(A,A)); }
double Cross(Point A,Point B) { return A.x*B.y-A.y*B.x; }
Circle CircumscribedCircle(Point p1,Point p2,Point p3)
{
double Bx=p2.x-p1.x,By=p2.y-p1.y;
double Cx=p3.x-p1.x,Cy=p3.y-p1.y;
double D=2*(Bx*Cy-By*Cx);
double cx=(Cy*(Bx*Bx+By*By)-By*(Cx*Cx+Cy*Cy))/D+p1.x;
double cy=(Bx*(Cx*Cx+Cy*Cy)-Cx*(Bx*Bx+By*By))/D+p1.y;
Point p=Point(cx,cy);
return Circle(p,Length(p1-p));
}
void min_cover_circle(Point p[],int n,Circle& c)
{
c.c=p[0]; c.r=0;
for(int i=1;i<n;i++)
{
if(dcmp(Length(p[i]-c.c)-c.r)>0)
{
c.c=p[i]; c.r=0;
for(int j=0;j<i;j++)
{
if(dcmp(Length(p[j]-c.c)-c.r)>0)
{
c.c=Point((p[i].x+p[j].x)/2.,(p[i].y+p[j].y)/2.);
c.r=Length(p[j]-p[i])/2.;
for(int k=0;k<j;k++)
{
if(dcmp(Length(p[k]-c.c)-c.r)>0)
{
c=CircumscribedCircle(p[i],p[j],p[k]);
}
}
}
}
}
}
}
int n;
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=0;i<n;i++) scanf("%lf%lf",&pt[i].x,&pt[i].y);
Circle c;
min_cover_circle(pt,n,c);
printf("%.2lf\n",c.r+0.5);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/ck_boss/article/details/42241009