def orthocenter(p1, p2, p3):
  """三角形 (p1, p2, p3) の垂心を求める"""
  (x1, y1), (x2, y2), (x3, y3) = p1, p2, p3
  a1, a2, b1, b2 = 2*(x2-x1), 2*(x3-x1), 2*(y2-y1), 2*(y3-y1)
  c1, c2 = x1*x1-x2*x2+y1*y1-y2*y2, x1*x1-x3*x3+y1*y1-y3*y3
  if (a1*b2-a2*b1)==0: # 頂点が直線上に並ぶ場合
    return (max((x1, x2, x3))+min((x1, x2, x3)))/2, (max((y1, y2, y3))+min((y1, y2, y3)))/2
  else:
    return (b1*c2-b2*c1)/(a1*b2-a2*b1), (c1*a2-c2*a1)/(a1*b2-a2*b1)

import math
def circumcircle_generator(coords):
  """与えられた頂点を持つ全ての三角形から,全ての点を内包する外接円を返す"""
  for p, q, r in [(coords[i], coords[j], coords[k]) for i in range(len(coords)) for j in range(i+1, len(coords)) for k in range(j+1, len(coords))]:
    (cx, cy), (px, py) = orthocenter(p, q, r), p
    RR = (cx-px)*(cx-px)+(cy-py)*(cy-py)
    for i, (vx, vy) in enumerate(coords):
      rr = (cx-vx)*(cx-vx)+(cy-vy)*(cy-vy)
      if rr>RR: break # 円の外に点が見つかった
    if i==len(coords)-1: # 全ての点が円内にある
      yield (math.sqrt(RR), cx, cy)

import random, Tkinter
# 問題 1
z = zip(*((float(random.randrange(101)) for i in range(20)) for j in range(2)))
# 問題 2
circles = sorted(circumcircle_generator(z), key=lambda k: k[0])
print "Minimum circle: radius=%f, coord=(%f, %f)" %(circles[0])