/* template.cpp {{{ */ #include using namespace std; // #define int long long #define GET_MACRO(a, b, c, d, NAME, ...) NAME #define REP1(n) REP2(i_, n) #define REP2(i, n) REP3(i, 0, n) #define REP3(i, a, b) REP4(i, a, b, 1) #define REP4(i, a, b, s) for (long long i = (a); i < (long long)(b); i += (long long)(s)) #define RREP1(n) RREP2(i_, n) #define RREP2(i, n) RREP3(i, 0, n) #define RREP3(i, a, b) RREP4(i, a, b, 1) #define RREP4(i, a, b, s) for (long long i = (b) - 1; i >= (long long)(a); i -= (long long)(s)) #define rep(...) GET_MACRO(__VA_ARGS__, REP4, REP3, REP2, REP1)(__VA_ARGS__) #define rrep(...) GET_MACRO(__VA_ARGS__, RREP4, RREP3, RREP2, RREP1)(__VA_ARGS__) #define fs first #define sc second #define all(c) std::begin(c), std::end(c) #define pcnt(x) __builtin_popcountll(x) #define each(x, c) for (auto &&x : c) #define y0 y0_ #define y1 y1_ #define yn yn_ #define TMP_T template #define TMP_TU template #define TMP_Ts template #define TMP_NTs template #define TMP_CT template #ifndef DEBUG #define cerr no_output struct NoOutput : ostream { TMP_T NoOutput &operator<<(const T &){ return *this; } } no_output; #endif using uint = unsigned; using ll = long long; using ull = unsigned long long; using ld = long double; TMP_T using PQL = priority_queue, greater>; TMP_T using PQG = priority_queue; TMP_CT using enable_if_t = typename enable_if::type; const ll LLINF = 1e18 + 10; #ifndef int const int INF = 1e9 + 10; #else const int INF = LLINF; #endif const int dx[] = {-1, 0, 1, 0, -1, 1, 1, -1}; const int dy[] = {0, -1, 0, 1, -1, -1, 1, 1}; TMP_T inline constexpr T sq(T x){ return x * x; } TMP_TU inline T& chmin(T &x, U y){ if (x > y) x = y; return x; } TMP_TU inline T& chmax(T &x, U y){ if (x < y) x = y; return x; } TMP_NTs enable_if_t<(N >= sizeof...(T))> input_tuple(istream &, tuple &){} TMP_NTs enable_if_t<(N < sizeof...(T))> input_tuple(istream &is, tuple &x){ is >> get(x); input_tuple(is, x); } TMP_Ts ostream &operator>>(istream &is, tuple &x){ input_tuple<0, T...>(is, x); return is; } TMP_TU ostream &operator>>(istream &is, pair &x){ return is >> x.first >> x.second; } TMP_NTs enable_if_t<(N >= sizeof...(T))> print_tuple(ostream &, const tuple &){} TMP_NTs enable_if_t<(N < sizeof...(T))> print_tuple(ostream &os, const tuple &x){ os << (N > 0 ? " " : "") << get(x); print_tuple(os, x); } TMP_Ts ostream &operator<<(ostream &os, const tuple &x){ print_tuple<0, T...>(os, x); return os; } TMP_TU ostream &operator<<(ostream &os, const pair &x){ return os << x.first << " " << x.second; } #undef TMP_T #undef TMP_TU #undef TMP_Ts #undef TMP_NTs #undef TMP_CT struct prepare { prepare(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(12); cerr << fixed << setprecision(12); } } prepare_; /* }}} */ int n; ll x[1000], y[1000]; ll g[1000][1000]; signed main() { cin >> n; rep(i, n) cin >> x[i] >> y[i]; rep(i, n) rep(j, n) g[i][j] = sq(x[i] - x[j]) + sq(y[i] - y[j]); ll lb = 0, ub = 200000000; while (ub - lb > 1){ ll md = (lb + ub) / 2; ll len = 100 * md * md; bool vis[1000] = {}; queue q; vis[0] = true; q.push(0); while (q.size()){ int v = q.front(); q.pop(); rep(i, n){ if (vis[i]) continue; if (g[v][i] > len) continue; vis[i] = true; q.push(i); } } (vis[n - 1] ? ub : lb) = md; } cout << 10 * ub << endl; }