Language: C++

#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")
 
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
 
using namespace std;
using namespace __gnu_pbds;
 
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;
 
typedef pair<int, int> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;
 
typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;
 
template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;
 
#define FOR(i, a, b1) for (int i=a; i<(b1); i++)
#define F0R(i, a) for (int i=0; i<(a); i++)
#define FORd(i,a,b1) for (int i = (c)-1; i >= a; i--)
#define F0Rd(i,a) for (int i = (b1)-1; i >= 0; i--)
 
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
 
const int MOD = 1000000007;
const ll INF = 1e18;
const int MX = 100001; //check the limits, dummy
// SOURCE:  nayuki.io
struct Point final {
	
	public: double x;
	public: double y;
	
	
	public: Point subtract(const Point &p) const;
	
	public: double distance(const Point &p) const;
	
	// Signed area / determinant thing
	public: double cross(const Point &p) const;
	
};


struct Circle final {
	
	public: static const Circle INVALID;
	
	private: static const double MULTIPLICATIVE_EPSILON;
	
	
	public: Point c;   // Center
	public: double r;  // Radius
	
	
	public: bool contains(const Point &p) const;
	
	public: bool contains(const std::vector<Point> &ps) const;
	
};

/---- Members of struct Point ----/

Point Point::subtract(const Point &p) const {
	return Point{x - p.x, y - p.y};
}


double Point::distance(const Point &p) const {
	return std::hypot(x - p.x, y - p.y);
}


double Point::cross(const Point &p) const {
	return x * p.y - y * p.x;
}


/---- Members of struct Circle ----/

const Circle Circle::INVALID{Point{0, 0}, -1};

const double Circle::MULTIPLICATIVE_EPSILON = 1 + 1e-14;


bool Circle::contains(const Point &p) const {
	return c.distance(p) <= r * MULTIPLICATIVE_EPSILON;
}


bool Circle::contains(const vector<Point> &ps) const {
	for (const Point &p : ps) {
		if (!contains(p))
			return false;
	}
	return true;
}


/---- Smallest enclosing circle algorithm ----/

static Circle makeSmallestEnclosingCircleOnePoint (const vector<Point> &points, size_t end, const Point &p);
static Circle makeSmallestEnclosingCircleTwoPoints(const vector<Point> &points, size_t end, const Point &p, const Point &q);

static std::default_random_engine randGen((std::random_device())());
Circle makeDiameter(const Point &a, const Point &b) {
	Point c{(a.x + b1.x) / 2, (a.y + b1.y) / 2};
	return Circle{c, max(c.distance(a), c.distance(b1))};
}
Circle makeCircumcircle(const Point &a, const Point &b1, const Point &c) {
	// Mathematical algorithm from Wikipedia: Circumscribed circle
	double ox = (min(min(a.x, b1.x), c.x) + max(min(a.x, b1.x), c.x)) / 2;
	double oy = (min(min(a.y, b1.y), c.y) + max(min(a.y, b1.y), c.y)) / 2;
	double ax = a.x - ox,  ay = a.y - oy;
	double b1x = b1.x - ox,  b1y = b1.y - oy;
	double cx = c.x - ox,  cy = c.y - oy;
	double d = (ax * (b1y - cy) + b1x * (cy - ay) + cx * (ay - b1y)) * 2;
	if (d == 0)
		return Circle::INVALID;
	double x = ((ax*ax + ay*ay) * (b1y - cy) + (b1x*b1x + b1y*b1y) * (cy - ay) + (cx*cx + cy*cy) * (ay - b1y)) / d;
	double y = ((ax*ax + ay*ay) * (cx - b1x) + (b1x*b1x + b1y*b1y) * (ax - cx) + (cx*cx + cy*cy) * (b1x - ax)) / d;
	Point p{ox + x, oy + y};
	double r = max(max(p.distance(a), p.distance(b)), p.distance(c));
	return Circle{p, r};
}
// Initially: No boundary points known
Circle makeSmallestEnclosingCircle(const vector<Point> &points) {
	// Clone list to preserve the caller's data, randomize order
	vector<Point> shuffled = points;
	std::shuffle(shuffled.begin(), shuffled.end(), randGen);
	
	// Progressively add points to circle or recompute circle
	Circle c = Circle::INVALID;
	for (size_t i = 0; i < shuffled.size(); i++) {
		const Point &p = shuffled.at(i);
		if (c.r < 0 || !c.contains(p))
			c = makeSmallestEnclosingCircleOnePoint(shuffled, i + 1, p);
	}
	return c;
}


// One boundary point known
static Circle makeSmallestEnclosingCircleOnePoint(const vector<Point> &points, size_t end, const Point &p) {
	Circle c{p, 0};
	for (size_t i = 0; i < end; i++) {
		const Point &q = points.at(i);
		if (!c.contains(q)) {
			if (c.r == 0)
				c = makeDiameter(p, q);
			else
				c = makeSmallestEnclosingCircleTwoPoints(points, i + 1, p, q);
		}
	}
	return c;
}


// Two boundary points known
static Circle makeSmallestEnclosingCircleTwoPoints(const vector<Point> &points, size_t end, const Point &p, const Point &q) {
	Circle circ = makeDiameter(p, q);
	Circle left  = Circle::INVALID;
	Circle right = Circle::INVALID;
	
	// For each point not in the two-point circle
	Point pq = q.subtract(p);
	for (size_t i = 0; i < end; i++) {
		const Point &r = points.at(i);
		if (circ.contains(r))
			continue;
		
		// Form a circumcircle and classify it on left or right side
		double cross = pq.cross(r.subtract(p));
		Circle c = makeCircumcircle(p, q, r);
		if (c.r < 0)
			continue;
		else if (cross > 0 && (left.r < 0 || pq.cross(c.c.subtract(p)) > pq.cross(left.c.subtract(p))))
			left = c;
		else if (cross < 0 && (right.r < 0 || pq.cross(c.c.subtract(p)) < pq.cross(right.c.subtract(p))))
			right = c;
	}
	
	// Select which circle to return
	if (left.r < 0 && right.r < 0)
		return circ;
	else if (left.r < 0)
		return right;
	else if (right.r < 0)
		return left;
	else
		return left.r <= right.r ? left : right;
}



int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);    
	
    int N; cin >> N;
    vpi data(N); F0R(i, N) {
        int X, Y; cin >> X >> Y; data[i] = {X, Y};
    }

    vector<Point> points;
    F0R(i, N) {
        Point p;
        p.x = data[i].f;
        p.y = data[i].s;
        points.pb(p);
    }
    const vector<Point> finPoints = points;
    Circle c = makeSmallestEnclosingCircle(finPoints);

    cout << setprecision(20) <<  c.r << endl;
	return 0;
}
 
// read the question correctly (ll vs int)
// template by bqi343

Compiler output:
a.cc:81:1: error: expected unqualified-id before '/' token
   81 | /---- Members of struct Point ----/
      | ^
a.cc:98:1: error: expected unqualified-id before '/' token
   98 | /---- Members of struct Circle ----/
      | ^
a.cc:119:1: error: expected unqualified-id before '/' token
  119 | /---- Smallest enclosing circle algorithm ----/
      | ^
a.cc: In function 'Circle makeDiameter(const Point&, const Point&)':
a.cc:126:24: error: 'b1' was not declared in this scope; did you mean 'b'?
  126 |         Point c{(a.x + b1.x) / 2, (a.y + b1.y) / 2};
      |                        ^~
      |                        b
a.cc: In function 'Circle makeCircumcircle(const Point&, const Point&, const Point&)':
a.cc:142:54: error: 'b' was not declared in this scope
  142 |         double r = max(max(p.distance(a), p.distance(b)), p.distance(c));
      |                                                      ^
a.cc: In function 'Circle makeSmallestEnclosingCircle(const std::vector<Point>&)':
a.cc:156:29: error: 'makeSmallestEnclosingCircleOnePoint' was not declared in this scope; did you mean 'makeSmallestEnclosingCircleTwoPoints'?
  156 |                         c = makeSmallestEnclosingCircleOnePoint(shuffled, i + 1, p);
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                             makeSmallestEnclosingCircleTwoPoints