洛谷P1742 最小圆覆盖(计算几何 最小圆覆盖模板)

题目描述

给出N个点,让你画一个最小的包含所有点的圆。

输入格式

先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000.0)

输出格式

输出圆的半径,及圆心的坐标,保留10位小数

输入输出样例

输入 #1复制

6
8.0 9.0
4.0 7.5
1.0 2.0
5.1 8.7
9.0 2.0
4.5 1.0

输出 #1复制

5.0000000000
5.0000000000 5.0000000000

说明/提示

5.00 5.00 5.0

 

#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
const int N = 1e5 + 5;

struct node
{
    double x, y;
}p[N];

node c; ///圆心
double r;   ///半径

int sgn(double x)
{
    if (fabs(x) < eps)
        return 0;
    else
        return x < 0 ? -1 : 1;
}

double Distance(node A, node B) ///两点距离
{
    return hypot(A.x - B.x, A.y - B.y); ///hypot(a, b)求以a, b为直角边的直角三角形斜边长
}

///求三角形abc的外接圆圆心
node circle_center(const node a, const node b, const node c)
{
    node center;
    double a1 = b.x - a.x, b1 = b.y - a.y, c1 = (a1 * a1 + b1 * b1) / 2;
    double a2 = c.x - a.x, b2 = c.y - a.y, c2 = (a2 * a2 + b2 * b2) / 2;
    double d = a1 * b2 - a2 * b1;
    center.x = a.x + (c1 * b2 - c2 * b1) / d;
    center.y = a.y + (a1 * c2 - a2 * c1) / d;
    return center;
}

///求最小圆覆盖,返回圆心c和半径r:
void min_cover_circle(int n)
{
    random_shuffle(p, p + n);             ///打乱所有点
    c = p[0];
    r = 0;                    ///第一个点
    for (int i = 1; i < n; ++i)        ///剩下所有点
    {
        if (sgn(Distance(p[i], c) - r) > 0) ///pi在圆外部
        {
            c = p[i];
            r = 0;                ///将圆心设为pi半径为0
            for (int j = 0; j < i; ++j) ///重新检查前面的点
            {
                if (sgn(Distance(p[j], c) - r) > 0)///两点定圆
                {
                    c.x = (p[i].x + p[j].x) / 2;
                    c.y = (p[i].y + p[j].y) / 2;
                    r = Distance(p[j], c);
                    for (int k = 0; k < j; ++k)
                    {
                        if (sgn(Distance(p[k], c) - r) > 0)
                        {
                            c = circle_center(p[i], p[j], p[k]);
                            r = Distance(p[i], c);
                        }
                    }
                }
            }
        }
    }
}

int main()
{
    int n;
    while(~scanf("%d", &n))
    {
        for(int i = 0; i < n; ++i)
        {
            scanf("%lf%lf", &p[i].x, &p[i].y);
        }
        min_cover_circle(n);
        printf("%.10f\n", r);
        printf("%.10f %.10f\n", c.x, c.y);
    }
    return 0;
}

 

全部评论

相关推荐

想去毕业旅行的斑马在...:学校不是92的话,没有实习经历投不了大厂,去投中小厂,拿点实习经历
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
6678次浏览 64人参与
# 你的实习产出是真实的还是包装的? #
1331次浏览 32人参与
# 巨人网络春招 #
11223次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7120次浏览 37人参与
# 简历第一个项目做什么 #
31334次浏览 315人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186557次浏览 1115人参与
# 米连集团26产品管培生项目 #
4806次浏览 206人参与
# 研究所笔面经互助 #
118794次浏览 577人参与
# 面试紧张时你会有什么表现? #
30416次浏览 188人参与
# 简历中的项目经历要怎么写? #
309597次浏览 4167人参与
# 职能管理面试记录 #
10726次浏览 59人参与
# AI时代,哪些岗位最容易被淘汰 #
62775次浏览 750人参与
# 网易游戏笔试 #
6382次浏览 83人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
7014次浏览 154人参与
# 腾讯音乐求职进展汇总 #
160447次浏览 1107人参与
# 从哪些方向判断这个offer值不值得去? #
56712次浏览 357人参与
# 正在春招的你,也参与了去年秋招吗? #
362761次浏览 2632人参与
# 你怎么看待AI面试 #
179447次浏览 1184人参与
# 小红书求职进展汇总 #
226916次浏览 1357人参与
# 你的房租占工资的比例是多少? #
92153次浏览 896人参与
# 校招笔试 #
467856次浏览 2955人参与
# 经纬恒润求职进展汇总 #
155724次浏览 1085人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务