#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <list>
#include <map>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <limits>
#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <numeric>
#include <unordered_set>
#include <unordered_map>
#include <chrono>
#include <random>
#include <bits/stdc++.h>
 
using namespace std;
 
#define ll long long
#define PI 3.14159265358979323846
#define min(a,b) ((a<b)?(a):(b))
#define max(a,b) ((a<b)?(b):(a))
#define abs(a) ((a>0)?a:-(a))

const double eps = (double)1e-6;
const int maxn = 1e5+5;
const ll mod = 1e9+7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

struct vec {
    double x,y;
    vec (const double& x0 = 0, const double& y0 = 0) : x(x0), y(y0) {};
    vec operator + (const vec& t) const {return vec(x+t.x, y+t.y);}
    vec operator - (const vec& t) const {return vec(x-t.x, y-t.y);}
    vec operator * (const double& t) const {return vec(x*t, y*t);}  //只能vec*double
    vec operator / (const double& t) const {return vec(x/t, y/t);}  //只能vec*double
};

double dot(const vec& a, const vec& b) {return a.x*b.x + a.y*b.y;}  //向量a,b的点乘
double cross(const vec& a, const vec& b) {return a.x*b.y - a.y*b.x;}  //向量a,b的叉乘
double len(const vec& a) {return sqrt(a.x*a.x + a.y*a.y);}  //vector的长度
double dist(const vec& a, const vec& b) {return len(a-b);}  //点a,b之间距离
bool isparallel(const vec& a, const vec& b) {return cross(a,b) < eps;}  //向量a,b是否平行
vec rotate90(const vec& a) {return vec(a.y, -a.x);}  //返回旋转90度的vector
vec norm(const vec& a) {return a/len(a);}  //返回normalized vector


/* 返回直线 p1+t1v1 = p2+t2v2 的交点 */
vec intersect(const vec& p1, const vec& v1, const vec& p2, const vec& v2) {
    double t = cross(p2-p1, v2) / cross(v1, v2);
    return p1 + v1 * t;
}

/* 三点确立外接圆, 返回圆心 */
vec three_point_circle(const vec& a, const vec& b, const vec& c) {
    vec p1 = (a+b)/2, p2 = (a+c)/2;  //position vector
    vec v1 = rotate90((b-a)), v2 = rotate90((c-a));  //direction vector
    if (isparallel(v1,v2)) {  //v1,v2平行，三点共线的话, 取最长的那个作为直径
        if (dist(a,b) + dist(a,c) - dist(b,c) < eps) return (b+c)/2;
        if (dist(a,b) + dist(b,c) - dist(a,c) < eps) return (a+c)/2;
        if (dist(a,c) + dist(b,c) - dist(a,b) < eps) return (a+b)/2;
    }
    return intersect(p1,v1,p2,v2); //返回圆心
}

vec points[maxn];
bool incircle(vec center, double radius, vec p) {
    return dist(center,p) <= radius+eps;
}

int main() {
 
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n; cin >> n;
    double x,y;
    for (int i = 1; i <= n; i++) {
        cin >> x >> y;
        points[i] = vec(x,y);
    }

    shuffle(points+1, points+n+1, rng);

    double radius = dist(points[1], points[2])/2;
    vec center = (points[1] + points[2]) / 2;

    for (int i = 3; i <= n; i++) {
        if (incircle(center, radius, points[i])) continue;
        //now, this points[i] is not in circle, it lies on the boundary
        center = points[i]; radius = 0;
        for (int j = 1; j < i; j++) {
            if (incircle(center, radius, points[j])) continue;
            //now, this points[j] is not in circle, lies on the boundary
            center = (points[i]+points[j])/2;
            radius = dist(points[i], center);
            for (int k = 1; k < j; k++) {
                if (incircle(center, radius, points[k])) continue;
                //now, this k forms a circle
                center = three_point_circle(points[i], points[j], points[k]);
                radius = dist(center, points[i]);
            }
        }
    }

    printf("%.10f\n", radius);
}

Measured memory_bytes: 1792