#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef vector VI; typedef pair PLL; #define REP(i,s,t) for(int i=(s);i<(t);i++) #define FILL(x,v) memset(x,v,sizeof(x)) #define MAXN 1005 VI adj[MAXN]; int N, R, RB; int lb, v[MAXN], vlow[MAXN]; bool isArt[MAXN]; void dfs(int x, int pre) { vlow[x] = v[x] = ++lb; REP(i,0,adj[x].size()){ int y = adj[x][i]; if(y==pre) continue; if(!v[y]){ if(x==R) RB++; dfs(y, x); vlow[x] = min(vlow[x], vlow[y]); isArt[x] |= vlow[y] >= v[x]; }else vlow[x] = min(vlow[x], v[y]); } } void tarjan(int root) { FILL(v, 0); FILL(vlow, 0); FILL(isArt, false); lb = 0; R = root; RB = 0; dfs(root, -1); } double dst[MAXN][MAXN]; int main() { cin >> N; VI x(N+1,0), y(N+1,0); REP(i,1,N+1) cin >> x[i] >> y[i]; N++; REP(i,0,N) REP(j,i+1,N) dst[i][j] = dst[j][i] = sqrt((double)(x[i] - x[j]) * (double)(x[i] - x[j]) + (double)(y[i] - y[j]) * (y[i] - y[j])); double l = 0, r = 4e9; REP(it,0,64) { double m = (l + r) / 2; REP(i,0,N) adj[i].clear(); REP(i,0,N) REP(j,i+1,N) if (dst[i][j] <= m) { adj[i].push_back(j); adj[j].push_back(i); } tarjan(0); bool ok = true; REP(i,1,N) { if (v[i] == 0 || isArt[i]) ok = false; } if (ok) r = m; else l = m; } printf("%.9lf\n", l); return 0; }