最小圆覆盖

前言

想不出骚话了。

算法讲解

定义

用半径最小的圆覆盖所有的点。

随机增量法

引理1

最小圆覆盖唯一存在。

引理2

给定点集中,最多根据三个点确定最小覆盖圆。

引理3

如果一个点 $P$ 不在集合 $S(P\notin S)$ 的最小圆覆盖内,那么 $P$ 一定在 $P\cup S$ 的最小圆覆盖上。

求解

那么根据以上引理。我们可以得出求解方法:

  1. 当前已经求得前 $i-1$ 个点的最小覆盖圆为 $C$。
  2. 如果第 $i$ 个点在圆 $C$ 内,那么最小覆盖圆仍然是 $C$。
  3. 否则,第 $i$ 个点一定在最小覆盖圆上,接着确定前 $i-1$ 个点还有哪两个(或哪一个)在最小覆盖圆上。把当前的圆心设为 $P_i$,半径为 $0$。
  4. 固定了一个点时:找到不在当前覆盖圆上的点,圆心为 $P_i$ 与 $P_j$ 中点,半径为两点距离的一半。
  5. 固定了两个点时:找到不在当前覆盖圆上的点,当前覆盖圆为 $P_i$、$P_j$、$P_k$ 的外接圆。

其中求外接圆直接套用向量旋转、向量求交即可。

代码

洛谷最小圆覆盖模板

复杂度

这是一个比较 玄学 的复杂度。
点集中最多根据 3 个点即可确定最小覆盖圆,那么每个点参与确定最小点覆盖的概率不大于 $\frac{3}{n}$。
那么进入下一层循环的概率不大于 $\frac{3}{i}$。
则三层循环复杂度分别 $T_1(n)$,$T_2(n)$,$T_3(n)$,那么:
$T_1(n)=O(n)+\sum_{n}^{i=1}\frac{3}{i}T_2(i)$
$T_2(n)=O(n)+\sum_{n}^{i=1}\frac{3}{i}T_3(i)$
$T_3(n)=O(n)$

得 $T_1(n)=T_2(n)=T_3(n)=O(n)$,即复杂度 $O(n)$。

例题

P1742 最小圆覆盖

links,模板题。

P4288 [SHOI2014] 信号增幅仪

links,稍微转化一下即可。
把坐标轴顺时针旋转 $a$ 度,再把 x 轴按比例缩小至 $\frac{1}{p}$,做最小圆覆盖即可。

尾声

Just this.