func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 10000;   const long long INFFLUJO = 1e14;   const double INFCOSTO = 1e14;   struct edge {     int u, v;     long long cap, flow;     double cost;     long long rem() { return cap - flow; }   };   int nodes;   vector<int> G[MAXN];   vector<edge> e;   void addEdge(int u, int v, long long cap, double cost) {     G[u].push_back(((int)e.size()));     e.push_back((edge){u, v, cap, 0, cost});     G[v].push_back(((int)e.size()));     e.push_back((edge){v, u, 0, 0, -cost});   }   double dist[MAXN], mnCost;   int pre[MAXN];   long long cap[MAXN], mxFlow;   bool in_queue[MAXN];   void flow(int s, int t) {     memset(in_queue, 0, sizeof(in_queue));     mxFlow = mnCost = 0;     while (1) {       fill(dist, dist + nodes, INFCOSTO);       dist[s] = 0;       memset(pre, -1, sizeof(pre));       pre[s] = 0;       memset(cap, 0, sizeof(cap));       cap[s] = INFFLUJO;       queue<int> q;       q.push(s);       in_queue[s] = 1;       while (((int)q.size())) {         int u = q.front();         q.pop();         in_queue[u] = 0;         for (auto it : G[u]) {           edge &E = e[it];           if (E.rem() && dist[E.v] > dist[u] + E.cost + 1e-9) {             dist[E.v] = dist[u] + E.cost;             pre[E.v] = it;             cap[E.v] = min(cap[u], E.rem());             if (!in_queue[E.v]) q.push(E.v), in_queue[E.v] = 1;           }         }       }       if (pre[t] == -1) break;       mxFlow += cap[t];       mnCost += cap[t] * dist[t];       for (int v = t; v != s; v = e[pre[v]].u) {         e[pre[v]].flow += cap[t];         e[pre[v] ^ 1].flow -= cap[t];       }     }   }   int x[500], y[500];   int main() {     int n;     scanf( %d , &n);     int mx = -1100000;     for (int i = 0; i < int(n); i++) {       scanf( %d %d , x + i, y + i);       mx = max(mx, y[i]);     }     int cnt = 0;     for (int i = 0; i < int(n); i++)       if (y[i] == mx) cnt++;     if (cnt > 1)       printf( -1 n );     else {       nodes = 2 * n + 2;       for (int i = 0; i < int(n); i++)         for (int j = 0; j < int(n); j++)           if (y[i] > y[j]) {             addEdge(i, n + j, 1,                     sqrt(1ll * (x[i] - x[j]) * (x[i] - x[j]) +                          1ll * (y[i] - y[j]) * (y[i] - y[j])));           }       for (int i = 0; i < int(n); i++) addEdge(2 * n, i, 2, 0);       for (int i = 0; i < int(n); i++)         if (y[i] != mx) addEdge(n + i, 2 * n + 1, 1, 0);       flow(2 * n, 2 * n + 1);       if (mxFlow != n - 1)         printf( -1 n );       else         printf( %.10lf n , mnCost);     }   }   