題目大意:給定平面上 n 個點,求最小圓覆蓋
我就是抄了個板而已…
Q:爲什麼是
A:(搖頭搖頭搖頭
Q:三角形外心怎麼求
A:不知道…
Q:學這個有什麼用
A:(一臉懵逼
Q:怎麼什麼都不知道→→
A:窩弱嘛TAT
怎麼覺得自己又抽了=。=
三角形外心 (我知道泥萌都會。。。
因爲到各點距離相等,有
化簡得到
有
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define D double
#define N 505
#define pf(x) (x * x)
using namespace std;
int n;D r;
struct point{D x,y;}e[N],ans;
D dis(point a,point b)
{
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
point center(point a,point b,point c)
{
D A1 = (b.x - a.x) * 2,B1 = (b.y - a.y) * 2,C1 = pf(b.x) + pf(b.y) - pf(a.x) - pf(a.y);
D A2 = (c.x - b.x) * 2,B2 = (c.y - b.y) * 2,C2 = pf(c.x) + pf(c.y) - pf(b.x) - pf(b.y);
return (point){(C1 * B2 - C2 * B1) / (A1 * B2 - A2 * B1),
(A1 * C2 - A2 * C1) / (A1 * B2 - A2 * B1)};
}
void mcc()
{
random_shuffle(e + 1,e + n + 1);
ans = e[1],r = 0;
for (int i = 2;i <= n;i ++)
if (dis(ans,e[i]) > r)
{
ans = e[i],r = 0;
for (int j = 1;j < i;j ++)
if (dis(ans,e[j]) > r)
{
ans.x = (e[i].x + e[j].x) / 2.;
ans.y = (e[i].y + e[j].y) / 2.;
r = dis(ans,e[j]);
for (int k = 1;k < j;k ++)
if (dis(ans,e[k]) > r)
{
ans = center(e[i],e[j],e[k]);
r = dis(ans,e[i]);
}
}
}
}
int main()
{
while (scanf("%d",&n) && n)
{
for (int i = 1;i <= n;i ++)
scanf("%lf%lf",&e[i].x,&e[i].y);
mcc();
printf("%.2f %.2f %.2f\n",ans.x,ans.y,r);
}
return 0;
}