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;
typedef long long ll;
#define rep(i, n) for(int i = 0; i < n; i++)

float distance(pair<float, float>xy1, pair<float, float>xy2) {
    return hypot(xy1.first - xy2.first, xy1.second - xy2.second);
}

bool in_circle(float r, pair<float, float> coordinate, vector<pair<float, float>> xy) {
    bool judge = true;
    for (int i = 0; i < xy.size(); i++) {
        if (distance(xy[i], coordinate) > r+0.001) {
            judge = false;
            break;
        }
    }
    return judge;
}

bool check_line(pair<float, float>xy1, pair<float, float>xy2, pair<float, float>xy3) {
    return (abs((xy2.second-xy1.second)/(xy2.first-xy1.first) - (xy3.second-xy2.second)/(xy3.first-xy2.first)) < 0.001);
}

pair<float, float> calc_circumcenter(pair<float, float>xy1, pair<float, float>xy2, pair<float, float>xy3) {
    float a = xy1.first;
    float b = xy1.second;
    float c = xy2.first;
    float d = xy2.second;
    float e = xy3.first;
    float f = xy3.second;
    
    float x;
    float y = (((e-a)*(a*a+b*b-c*c-d*d)-(c-a)*(a*a+b*b-e*e-f*f)) / (2*(e-a)*(b-d) -2*(c-a)*(b-f)));
    if (c-a != 0)
        x = (2*(b-d)*y-a*a-b*b+c*c+d*d) / (2*(c-a));
    else
        x = (2*(b-f)*y-a*a-b*b+e*e+f*f) / (2*(e-a));
    return make_pair(x, y);
}

int main(void){
    int n;
    cin >> n;
    vector<pair<float, float>> xy(n);
    rep(i, n) {
        float x, y;
        cin >> x >> y;
        xy[i] = make_pair(x, y);
    }
    
    float min_r = 1000;
    for (int i = 0; i < n-1; i++) {
        for (int j = i+1; j < n; j++) {
            float r = distance(xy[i], xy[j]) / 2;
            pair<float, float> center = make_pair((xy[i].first + xy[j].first)/2, (xy[i].second + xy[j].second)/2);
            if (in_circle(r, center, xy))
                min_r = min(min_r, r);
        }
    }
    
    bool flag = false;
    for (int i = 0; i < n-2; i++) {
        for (int j = i+1; j < n-1; j++) {
            for (int k = j+1; k < n; k++) {
                if (!check_line(xy[i], xy[j], xy[k])) {
                    pair<float, float> center = calc_circumcenter(xy[i], xy[j], xy[k]);
                    float r = distance(center, xy[i]);
                    if (in_circle(r, center, xy)) {
                        min_r = min(min_r, r);
                        //bool flag = true;
                        //break;
                    }
                }
            }
            //if (flag)
            //    break;
        }
        //if (flag)
        //    break;
    }
    
    cout << fixed << setprecision(10) << min_r << endl;
}