最小圆覆盖
最小圆覆盖
前置知识:
二元一次方程求解
通过经典的行列式知识可以知道
不懂去学线性代数第一章行列式的第一小节,或者手动推导()
三点定圆
如果能够有三个点,有两条垂直平分线可以求出圆心,再用圆心和一个点可以求出半径,这就是所谓的三点定圆。
算法:最小增量法
性质1:最小覆盖圆是唯一的
性质2:若圆O1是点集S的最小覆盖圆,则再新加一点p,他在集合S的外部,则新点集的最小覆盖圆一定过点p,即p一定在最小覆盖圆上。
性质3:最终的最小覆盖圆一定只有两种情况:1是圆上至少有三个点,由三点限制一个圆(三点共圆);2是圆上只有两个点,则该圆一定是以该两点的连线为直径的。
性质3:最终的最小覆盖圆一定只有两种情况:1是圆上至少有三个点,由三点限制一个圆(三点共圆);2是圆上只有两个点,则该圆一定是以该两点的连线为直径的。
都比较显而易见()
随机增量法:就是从所有点里随机选一个加入自己的集合中,然后维护这个集合,然后再随机选一个点加入集合,再维护… 直到所有点都加入这个集合,那么最终的这个集合就是满足我要求的情况了。 然后我们找一个圆就是看能不能找到这个圆上的三个点。
首先我们先将所有点随机化。 三层循环,第一层从2到n循环i,我们将圆初始化为以第一个点为圆心,半径为0的圆。然后我们要循环判断i点在圆内还是在圆外,若在圆内(在圆上也认为是圆内),那Ci和Ci-1是相同的,我们直接循环i+1就行了;如果i在圆外,那么Ci一定过点i(性质2),然后我们就进第二层循环。 第二层从1到i-1循环j,我们将圆先初始化为以点i为圆心,0为半径的圆,然后不断去加点j,若j在圆内,就继续循环j+1;若j在圆外,就再进第三层循环。 第三层从1到j-1循环k,将圆先初始化为以i和j为直径的圆,然后再循环判断k,若在圆内,就继续循环下一个k+1;若k在圆外,就将圆更新为i、j、k三点确定的圆,直到最后求出来的圆就是最小覆盖圆。
最小圆覆盖
题目描述
给出 \(N\) 个点,让你画一个最小的包含所有点的圆。
输入格式
第一行一个整数 \(N\) 表示点的个数。
接下来 \(N\) 行每行两个实数 \(x_i,y_i\) 表示点的坐标。最多两位小数。
输出格式
第一行一个实数表示圆的半径。
第二行两个实数表示圆心的坐标。
本题开启 spj,您的答案与标准答案误差不超过 \(10^{-9}\) 时,视为正确。
样例 #1
样例输入 #1
1 | 6 |
样例输出 #1
1 | 5.0000000000 |
提示
对于 \(100\%\) 的数据,\(1\leq N\leq 10^5\),\(|x_i|,|y_i|\leq 10^4\)。
2022.2.26 添加 spj
1 |
|