Buggy python submission (verdict: Time Limit Exceeded):
import cmath, sys
EPS = 1e-8

#cmath.rect(r, th) 極座標→直交座標
#cmath.polar(c) 複素数→極座標
#print("{:.12f}.format(hoge)") 桁数指定

#射影
def Projection(point, begin, end):
	tmp = (point-begin) / (end-begin)
	return tmp.real * (end-begin) + begin

#反射
def Reflection(point, begin, end):
	tmp = (point-begin) / (end-begin)
	return tmp.conjugate() * (end-begin) + begin

#点と直線の距離
def PointLineDistance(point, begin, end):
	point, begin, end = point-begin, 0, end-begin
	point = (point / end) * abs(end)
	return abs(point.imag)

#点と線分の距離
def PointSegmentDistance(point, begin, end):
	point, begin, end = point-begin, 0, end-begin
	point = (point / end) * abs(end)
	end = abs(end)
	if -EPS <= point.real <= abs(end):
		return abs(point.imag)
	else:
		return min(abs(point), abs(point - end))

#外積
def OuterProduct(one, two):
	tmp = one.conjugate() * two
	return tmp.imag

#内積
def InnerProduct(one, two):
	tmp = one.conjugate() * two
	return tmp.real

#点が直線上にあるか
def IsOnLine(point, begin, end):
	return abs(OuterProduct(begin-point, end-point)) <= EPS

#点が線分上にあるか
def IsOnSegment(point, begin, end):
	if abs(OuterProduct(begin-point, end-point)) <= EPS and InnerProduct(begin-point, end-point) <= EPS:
		return True
	else:
		return False

#直線の交点，平行の場合はNoneを返す
def Crosspoint(a, b, c, d):
	if abs(OuterProduct(b-a, d-c)) <= EPS:
		return None
	else:
		u = OuterProduct(c-a, d-a) / OuterProduct(b-a, d-c)
		return (1-u)*a + u*b

#3点が反時計回りか
#一直線上のときの例外処理できていない→とりあえずT
def CCW(p, q, r):
	one, two = q-p, r-q
	if OuterProduct(one, two) > -EPS:
		return True
	else:
		return False

#線分どうし交叉
def Intersect_SS(b1, e1, b2, e2):
	if IsOnSegment(b1, b2, e2) or IsOnSegment(e1, b2, e2) or IsOnSegment(b2, b1, e1) or IsOnSegment(e2, b1, e1):
		return True
	elif (CCW(b1, e1, b2) != CCW(b1, e1, e2)) and (CCW(b2, e2, b1) != CCW(b2, e2, e1)):
		return True
	else:
		return False

#点と線分の距離
def SegmentSegmentDistance(a, b, c, d):
	if Intersect_SS(a, b, c, d):
		return 0
	else:
		return min(PointSegmentDistance(a, c, d), PointSegmentDistance(b, c, d), PointSegmentDistance(c, a, b), PointSegmentDistance(d, a, b))

#凸包リストを返す
def ConvexHull(dots):
	dots.sort(key=lambda x: (x.real, x.imag))
	res1 = [dots[0]]
	for d in dots[1:]:
		if len(res1) == 1:
			res1.append(d)
		else:
			while len(res1) > 1 and not CCW(res1[-2], res1[-1], d):
				res1.pop()
			res1.append(d)
	dots.reverse()
	res2 = [dots[0]]
	for d in dots[1:]:
		if len(res2) == 1:
			res2.append(d)
		else:
			while len(res2) > 1 and not CCW(res2[-2], res2[-1], d):
				res2.pop()
			res2.append(d)
	return res1[:-1] + res2[:-1]

#凸包の直径
def ConvexDiameter(qs):
	n = len(qs)
	if n == 2:
 		return abs(qs[0]-qs[1])
	i, j = 0, 0
	for k in range(n):
		if qs[k].real < qs[i].real:
			i = k
		if qs[j].real < qs[k].real:
			j = k
	res = 0
	si, sj = i, j
	while i != sj or j != si:
		res = max(res, abs(qs[i]-qs[j]))
		if OuterProduct(qs[i-n+1] - qs[i], qs[j-n+1] - qs[j]) < -EPS:
			i = (i+1) % n
		else:
			j = (j+1) % n
	return res

#凹多角形の内外判定(多角形はCCWリスト)
def InsidePolygon(point, dots):
	res = 0
	for i in range(len(dots)-1):
		res += cmath.phase((dots[i+1]-point) / (dots[i]-point))
	res += cmath.phase((dots[0]-point) / (dots[-1]-point))
	if abs(res) <= EPS:
		return False
	else:
		return True

#凹多角形の面積(多角形はCCWリスト)
def Area(dots):
	res = 0
	for i in range(len(dots)-1):
		res += OuterProduct(dots[i], dots[i+1])
	res += OuterProduct(dots[-1], dots[0])
	return res/2


n = int(input())

dots = []
for _ in range(n):
	x, y = map(int, input().split())
	dots.append(complex(x, y))

if n == 2:
	print(abs(dots[0]-dots[1])/2)
	sys.exit()

ch = ConvexHull(dots)
#print(ch)

ans = 10**6
m = len(ch)
for i in range(m):
	for j in range(i+1, m):
		for k in range(j+1, m):
			x, y, z = ch[i], ch[j], ch[k]
			if Crosspoint(x, y, z, y) is None:
				center, diam = (x+y)/2, abs(x-y)/2
				if abs(y-z)/2 > diam:
					center, diam = (y+z)/2, abs(y-z)/2
				if abs(z-x)/2 > diam:
					center, diam = (z+x)/2, abs(z-x)/2

			else:
				cos_x = InnerProduct(y-x, z-x) / (abs(y-x) * abs(z-x))
				cos_y = InnerProduct(x-y, z-y) / (abs(x-y) * abs(z-y))
				cos_z = InnerProduct(y-z, x-z) / (abs(y-z) * abs(x-z))
				if cos_x < -EPS:
					center = (y+z)/2
					diam = abs(y-z)/2
				elif cos_y < -EPS:
					center = (x+z)/2
					diam = abs(x-z)/2
				elif cos_z < -EPS:
					center = (x+y)/2
					diam = abs(x-y)/2
				else:
					mid1, mid2 = (x+y)/2, (x+z)/2
					p1, p2 = mid1 + 1j * (x-y), mid2 + 1j * (x-z)
					center = Crosspoint(mid1, p1, mid2, p2)
					diam = abs(x-center)

			#print(diam, center)
			ok = True
			for d in ch:
				if d == x or d == y or d == z:
					continue
				if abs(d-center) > diam - EPS:
					ok = False
			if ok:
				ans = min(ans, diam)

print(ans)


Fixed submission:
import cmath, sys
EPS = 1e-8

#cmath.rect(r, th) 極座標→直交座標
#cmath.polar(c) 複素数→極座標
#print("{:.12f}.format(hoge)") 桁数指定

#射影
def Projection(point, begin, end):
	tmp = (point-begin) / (end-begin)
	return tmp.real * (end-begin) + begin

#反射
def Reflection(point, begin, end):
	tmp = (point-begin) / (end-begin)
	return tmp.conjugate() * (end-begin) + begin

#点と直線の距離
def PointLineDistance(point, begin, end):
	point, begin, end = point-begin, 0, end-begin
	point = (point / end) * abs(end)
	return abs(point.imag)

#点と線分の距離
def PointSegmentDistance(point, begin, end):
	point, begin, end = point-begin, 0, end-begin
	point = (point / end) * abs(end)
	end = abs(end)
	if -EPS <= point.real <= abs(end):
		return abs(point.imag)
	else:
		return min(abs(point), abs(point - end))

#外積
def OuterProduct(one, two):
	tmp = one.conjugate() * two
	return tmp.imag

#内積
def InnerProduct(one, two):
	tmp = one.conjugate() * two
	return tmp.real

#点が直線上にあるか
def IsOnLine(point, begin, end):
	return abs(OuterProduct(begin-point, end-point)) <= EPS

#点が線分上にあるか
def IsOnSegment(point, begin, end):
	if abs(OuterProduct(begin-point, end-point)) <= EPS and InnerProduct(begin-point, end-point) <= EPS:
		return True
	else:
		return False

#直線の交点，平行の場合はNoneを返す
def Crosspoint(a, b, c, d):
	if abs(OuterProduct(b-a, d-c)) <= EPS:
		return None
	else:
		u = OuterProduct(c-a, d-a) / OuterProduct(b-a, d-c)
		return (1-u)*a + u*b

#3点が反時計回りか
#一直線上のときの例外処理できていない→とりあえずT
def CCW(p, q, r):
	one, two = q-p, r-q
	if OuterProduct(one, two) > -EPS:
		return True
	else:
		return False

#線分どうし交叉
def Intersect_SS(b1, e1, b2, e2):
	if IsOnSegment(b1, b2, e2) or IsOnSegment(e1, b2, e2) or IsOnSegment(b2, b1, e1) or IsOnSegment(e2, b1, e1):
		return True
	elif (CCW(b1, e1, b2) != CCW(b1, e1, e2)) and (CCW(b2, e2, b1) != CCW(b2, e2, e1)):
		return True
	else:
		return False

#点と線分の距離
def SegmentSegmentDistance(a, b, c, d):
	if Intersect_SS(a, b, c, d):
		return 0
	else:
		return min(PointSegmentDistance(a, c, d), PointSegmentDistance(b, c, d), PointSegmentDistance(c, a, b), PointSegmentDistance(d, a, b))

#凸包リストを返す
def ConvexHull(dots):
	dots.sort(key=lambda x: (x.real, x.imag))
	res1 = [dots[0]]
	for d in dots[1:]:
		if len(res1) == 1:
			res1.append(d)
		else:
			while len(res1) > 1 and not CCW(res1[-2], res1[-1], d):
				res1.pop()
			res1.append(d)
	dots.reverse()
	res2 = [dots[0]]
	for d in dots[1:]:
		if len(res2) == 1:
			res2.append(d)
		else:
			while len(res2) > 1 and not CCW(res2[-2], res2[-1], d):
				res2.pop()
			res2.append(d)
	return res1[:-1] + res2[:-1]

#凸包の直径
def ConvexDiameter(qs):
	n = len(qs)
	if n == 2:
 		return abs(qs[0]-qs[1])
	i, j = 0, 0
	for k in range(n):
		if qs[k].real < qs[i].real:
			i = k
		if qs[j].real < qs[k].real:
			j = k
	res = 0
	si, sj = i, j
	while i != sj or j != si:
		res = max(res, abs(qs[i]-qs[j]))
		if OuterProduct(qs[i-n+1] - qs[i], qs[j-n+1] - qs[j]) < -EPS:
			i = (i+1) % n
		else:
			j = (j+1) % n
	return res

#凹多角形の内外判定(多角形はCCWリスト)
def InsidePolygon(point, dots):
	res = 0
	for i in range(len(dots)-1):
		res += cmath.phase((dots[i+1]-point) / (dots[i]-point))
	res += cmath.phase((dots[0]-point) / (dots[-1]-point))
	if abs(res) <= EPS:
		return False
	else:
		return True

#凹多角形の面積(多角形はCCWリスト)
def Area(dots):
	res = 0
	for i in range(len(dots)-1):
		res += OuterProduct(dots[i], dots[i+1])
	res += OuterProduct(dots[-1], dots[0])
	return res/2


n = int(input())

dots = []
for _ in range(n):
	x, y = map(int, input().split())
	dots.append(complex(x, y))

if n == 2:
	print(abs(dots[0]-dots[1])/2)
	sys.exit()

ch = ConvexHull(dots)
#print(ch)

ans = 10**6
m = len(ch)
for i in range(m):
	for j in range(i+1, m):
		for k in range(j+1, m):
			x, y, z = ch[i], ch[j], ch[k]
			if Crosspoint(x, y, z, y) is None:
				center, diam = (x+y)/2, abs(x-y)/2
				if abs(y-z)/2 > diam:
					center, diam = (y+z)/2, abs(y-z)/2
				if abs(z-x)/2 > diam:
					center, diam = (z+x)/2, abs(z-x)/2

			else:
				cos_x = InnerProduct(y-x, z-x) / (abs(y-x) * abs(z-x))
				cos_y = InnerProduct(x-y, z-y) / (abs(x-y) * abs(z-y))
				cos_z = InnerProduct(y-z, x-z) / (abs(y-z) * abs(x-z))
				if cos_x < -EPS:
					center = (y+z)/2
					diam = abs(y-z)/2
				elif cos_y < -EPS:
					center = (x+z)/2
					diam = abs(x-z)/2
				elif cos_z < -EPS:
					center = (x+y)/2
					diam = abs(x-y)/2
				else:
					mid1, mid2 = (x+y)/2, (x+z)/2
					p1, p2 = mid1 + 1j * (x-y), mid2 + 1j * (x-z)
					center = Crosspoint(mid1, p1, mid2, p2)
					diam = abs(x-center)

			#print(diam, center)
			ok = True
			for d in ch:
				if d == x or d == y or d == z:
					continue
				if abs(d-center) > diam - EPS:
					ok = False
			if ok:
				ans = min(ans, diam)

print(ans)