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 (GCC 5.4.1) (judge verdict: Accepted)

#include<stdio.h>
#include<math.h>
double s, t;
double dist(double x1, double y1, double x2, double y2)
{
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
void f(double x1, double y1, double x2, double y2, double x3, double y3)
{
	if ((x3 - x1) * (y2 - y1) == (x2 - x1) * (y3 - y1))
	{
		if (x1 == x2)
		{
			s = x1;
			double maxy, miny;
			maxy = miny = y1;
			if (maxy < y2)maxy = y2;
			if (maxy < y3)maxy = y3;
			if (miny > y2)miny = y2;
			if (miny > y3)miny = y3;
			t = (maxy + miny) / 2;
			return;
		}
		if (x1 > x2)
		{
			double f = x1;
			x1 = x2;
			x2 = f;
			f = y1;
			y1 = y2;
			y2 = f;
		}
		if (x1 > x3)
		{
			double f = x1;
			x1 = x3;
			x3 = f;
			f = y1;
			y1 = y3;
			y3 = f;
		}
		if (x2 > x3)
		{
			double f = x2;
			x2 = x3;
			x3 = f;
			f = y2;
			y2 = y3;
			y3 = f;
		}
		s = (x1 + x3) / 2;
		t = (y1 + y3) / 2;
		return;
	}
	t = (x2 * x2 + y2 * y2 - y1 * y1 - x1 * x1) * (x3 - x1) - (y3 * y3 + x3 * x3 - y1 * y1 - x1 * x1) * (x2 - x1);
	t /= 2 * ((y1 - y3) * (x2 - x1) - (y1 - y2) * (x3 - x1));
	if (x2 != x1)
	{
		s = 2 * t * (y1 - y2) + y2 * y2 + x2 * x2 - y1 * y1 - x1 * x1;
		s /= 2 * (x2 - x1);
	}
	else
	{
		s = 2 * t * (y1 - y3) + y3 * y3 + x3 * x3 - y1 * y1 - x1 * x1;
		s /= 2 * (x3 - x1);
	}
	return;
}
int main()
{
	int n;
	scanf("%d", &n);
	int i, j, k, l;
	double x[55], y[55];
	for (i = 0; i < n; i++)
		scanf("%lf %lf", &x[i], &y[i]);
	if (n == 2)
	{
		printf("%.20lf\n", dist(x[0], y[0], x[1], y[1]) / 2);
		return 0;
	}
	double ans = 10000000000000;
	double v;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			if (i != j)
			{
				for (k = 0; k < n; k++)
				{
					if (i != k && k != j)
					{
						f(x[i], y[i], x[j], y[j], x[k], y[k]);
						v = 0;
						for (l = 0; l < n; l++)
							if (v < dist(x[l], y[l], s, t))
								v = dist(x[l], y[l], s, t);
						if (ans > v)
							ans = v;
					}
				}
			}
		}
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			s = (x[i] + x[j]) / 2;
			t = (y[i] + y[j]) / 2;
			v = 0;
			for (k = 0; k < n; k++)
				if (dist(x[k], y[k], s, t) > v)
					v = dist(x[k], y[k], s, t);
			if (ans > v)
				ans = v;
		}
	}
	printf("%.20lf\n", ans);
	return 0;
}