ZOJ 1450 Minimal Circle 最小圆覆盖

套了个模板直接上,貌似没有随机化序列 QAQ

//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define ll long long
#define Max(a,b) (((a) > (b)) ? (a) : (b))
#define Min(a,b) (((a) < (b)) ? (a) : (b))
#define Abs(x) (((x) > 0) ? (x) : (-(x)))
using namespace std;

const int INF = 0x3f3f3f3f;
const int MAXN = 220;
const double eps = 1e-9;

struct POINT{
    double x;
    double y;
    POINT() : x(0), y(0) {};
    POINT(double _x_, double _y_) : x(_x_), y(_y_) {};
};

struct CIRCLE{
    POINT p;
    double r;
    CIRCLE() {};
    CIRCLE(POINT _p_, double _r_) : p(_p_), r(_r_) {};
};

double dist(POINT a,POINT b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

CIRCLE calc(POINT p1,POINT p2,POINT p3){//三点的外接圆圆心的函数:
    CIRCLE temp;
    double a,b,c,d,e,f;
    a = p2.x - p1.x;
    b = p2.y - p1.y;
    c = (p2.x * p2.x + p2.y * p2.y - p1.x * p1.x - p1.y * p1.y) / 2;
    d = p3.x - p1.x;
    e = p3.y - p1.y;
    f = (p3.x * p3.x + p3.y * p3.y - p1.x * p1.x - p1.y * p1.y) / 2;
    temp.p.y = (c * d - f * a) / (b * d - e * a);
    temp.p.x = (c * e - f * b) / (a * e - b * d);
    return temp;
}
CIRCLE minC(POINT *p,int n){
    CIRCLE O;
    int i,j,k;
    O.p = p[0];
    O.r = 0;
    for(i=  1; i < n ; i++){
        if(dist(O.p,p[i]) <= O.r + eps) continue;
        O.p = p[i];O.r = 0;
        for(j = 0; j < i; j++){
            if(dist(O.p,p[j]) <= O.r + eps) continue;
            O.p.x = (p[i].x + p[j].x) / 2;
            O.p.y = (p[i].y + p[j].y) / 2;
            O.r = dist(O.p,p[j]);
            for(k = 0; k < j; k++){
                if(dist(O.p,p[k]) <= O.r + eps) continue;
                O = calc(p[i],p[j],p[k]);
                O.r = dist(O.p,p[k]);
            }
        }
    }
    return O;
}

int main(){
    int i, j, n;
    POINT p[200];
    while(EOF != scanf("%d",&n)){
        if(n == 0)  break;
        for(i = 0; i < n; ++i)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        CIRCLE c = minC(p, n);
        printf("%.2f %.2f %.2f\n",c.p.x,c.p.y,c.r);
    }
    return 0;
}

ZOJ 1450 Minimal Circle 最小圆覆盖,布布扣,bubuko.com

时间: 2024-10-23 18:14:20

ZOJ 1450 Minimal Circle 最小圆覆盖的相关文章

zoj 1450 Minimal Circle 最小覆盖圆

题目链接: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. 题意描述:找到一个最小圆能够包含到所有的二维坐标点. 算法

ZOJ 1450 HDU 3007 (最小圆覆盖)

首先这个圆边上必有至少两点,打乱数组,然后利用枚举,不断重新定义圆,找出最小的圆 代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int N = 100005; const double eps = 1e-8; int n; struct Point { double x, y; Point()

ZOJ 1450

最小圆覆盖 #include <iostream> #include <algorithm> #include <cstdio> #include <cmath> using namespace std; const double eps=0.00000001; struct point { double x,y; }p[110]; struct circle{ point cent; double rad; }cir; int n; double Tria

HDOJ 2215 Maple trees 最小圆覆盖

增量法最小圆覆盖.... Maple trees Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1646    Accepted Submission(s): 510 Problem Description There are a lot of trees in HDU. Kiki want to surround all the t

最小圆覆盖模板

//最小圆覆盖 //输入: 从下标0开始的点集_ps和大小_n //输出: 覆盖所有点的最小圆 //复杂度: O(n) //注意: 会对_ps进行随机处理操作,将会改变点集的内部顺序 Circle MinCoverCir(Point _ps[],int _n) { //随机处理,但是会改变传入的点集. random_shuffle(_ps, _ps+_n);//复杂度O(_n) Circle rec; rec.r = 0; rec.c = _ps[0]; for(int i=1;i<_n;i++

HDU 3007 Buried memory 最小圆覆盖

题目大意:没看.反正就是求最小圆覆盖. 思路:一个神奇的算法--随机增量法.可以证明,这个算法可以在O(n)的时间复杂度内求出最小圆覆盖.虽然好像能卡掉的样子,但是加上一句random_shuffle就卡不掉了. 具体的过程是这样的: 在全局记录一个圆,表示目前的最小圆覆盖.从头开始扫描.遇到第一个不在当前最小圆覆盖内的点的时候: 将这个点与当前最小圆覆盖的圆心为直径做一个圆,作为当前的最小圆覆盖.从头开始扫描.遇到第一个不在当前最小圆覆盖的点的时候: 将刚才的两个点和当前点做三角形,将这个三角

BZOJ 1336 Balkan2002 Alien最小圆覆盖

题目大意:最小圆覆盖. 思路:再拍一份模板.做法见:http://blog.csdn.net/jiangyuze831/article/details/43950601 CODE: #define _CRT_SECURE_NO_WARNINGS #include <cmath> #include <cstdio> #include <cstring> #include <iomanip> #include <iostream> #include

BZOJ 3564 SHOI 2014 信号增幅仪 坐标变换+最小圆覆盖

题目大意:给出平面上的一些点,现在让你用一个长轴与x轴成一定角度的,长轴:短轴已知的椭圆来覆盖所有的坐标,求最小的短轴长度. 思路:很明显,这个椭圆的形状和放置状态已经给出了,但是没有办法求最小拖圆覆盖啊.采用坐标变换,将椭圆变成圆.首先我们先让长轴与x轴平行,将平面上的所有点都旋转这个角度.之后只需要让所有点的x坐标除以长轴:短轴就可以了.剩下的就是最小圆覆盖了. 注:坐标旋转公式: x' = x * cos(a) - y * sin(a) y' = x * sin(a) + y * cos(

BZOJ 1336 Balkan2002 Alien最小圆覆盖 随机增量法

题目大意:求最小圆覆盖 随机增量法裸题 注意多输出几位小数不然过不去= = #include <cmath> #include <cstdio> #include <cstring> #include <iomanip> #include <iostream> #include <algorithm> #define M 100100 #define EPS 1e-7 using namespace std; struct Point