Problem:
Score : 600 points

Problem Statement

Given are N points (x_i, y_i) in a two-dimensional plane.

Find the minimum radius of a circle such that all the points are inside or on it.

Constraints

2 \leq N \leq 50

0 \leq x_i \leq 1000

0 \leq y_i \leq 1000

The given N points are all different.

The values in input are all integers.

Input

Input is given from Standard Input in the following format:

N
x_1 y_1
:
x_N y_N

Output

Print the minimum radius of a circle such that all the N points are inside or on it.

Your output will be considered correct if the absolute or relative error from our answer is at most 10^{-6}.

Sample Input 1

2
0 0
1 0

Sample Output 1

0.500000000000000000

Both points are contained in the circle centered at (0.5,0) with a radius of 0.5.

Sample Input 2

3
0 0
0 1
1 0

Sample Output 2

0.707106781186497524

Sample Input 3

10
10 9
5 9
2 0
0 0
2 7
3 3
2 5
10 0
3 7
1 9

Sample Output 3

6.726812023536805158

If the absolute or relative error from our answer is at most 10^{-6}, the output will be considered correct.

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

using Cd = complex<double>;



inline std::complex<double> Circumcenter(std::complex<double> a, std::complex<double> b, std::complex<double> c) {

    //辺
    double eAB = abs(b - a);
    double eBC = abs(c - b);
    double eCA = abs(a - c);

    //角度(余弦定理)
    double aCAB = acos((eCA*eCA + eAB*eAB - eBC*eBC) / (2 * eCA*eAB));
    double aABC = acos((eAB*eAB + eBC*eBC - eCA*eCA) / (2 * eAB*eBC));
    double aBCA = acos((eBC*eBC + eCA*eCA - eAB*eAB) / (2 * eBC*eCA));

    double A = sin(2 * aCAB);
    double B = sin(2 * aABC);
    double C = sin(2 * aBCA);

    //外心の位置ベクトル(ベクトルの面積比の公式)
    std::complex<double> ans;
    ans.real((A*a.real() + B*b.real() + C*c.real()) / (A + B + C));
    ans.imag((A*a.imag() + B*b.imag() + C*c.imag()) / (A + B + C));

    return(ans);
}

inline double Circumradius(std::complex<double> a, std::complex<double> b, std::complex<double> c) {

    //辺
    double eAB = abs(b - a);
    double eBC = abs(c - b);
    double eCA = abs(a - c);

    //角度(余弦定理)
    double aCAB = acos((eCA*eCA + eAB*eAB - eBC*eBC) / (2 * eCA*eAB));

    //外接円の半径(正弦定理)
    double R = 0.5*eBC / sin(aCAB);

    return(R);

}




int N;
double eps = 0.0000005;
vector<Cd>z;

bool C1(double rad, Cd zt){
    for (int i = 0; i < N; ++i) {
        double a = abs(zt - z[i]);
        if (a > rad+eps) return false;
    }
    return true;
}

int main() {
    cin >> N;
    z.resize(N);
    for (int i = 0; i < N; ++i) {
        int x, y;
        cin >> x >> y;
        z[i] = Cd(x, y);
    }

    if (N == 2) {
        double ans = abs(z[1] - z[0]) / 2;
        cout << setprecision(20) << ans << "\n";
        return 0;
    }

    double ans = 1000000;
    for (int i = 0; i < N; ++i) {
        for (int j = i+1; j < N; ++j) {
            for (int k = j+1; k < N; ++k) {
                double rad = Circumradius(z[i], z[j], z[k]);
                Cd cen = Circumcenter(z[i], z[j], z[k]);
                if (C1(rad, cen)) ans = min(ans, rad);
            }
        }
    }
    cout << setprecision(20) << ans << "\n";
    return 0;
}