#include #include #include #include #include #include using namespace std; struct Point{ int x, y, index; Point(int x, int y, int idx){ this->x = x; this->y = y; this->index = idx; } }; void createCombinations(vector arr, string out, int i, int n, int k, vector &results){ if(k == 0){ results.push_back(out); return; } for(int j = i; j < n; j++){ createCombinations(arr, out + " " + to_string(arr[j]), j + 1, n, k - 1, results); } } double calculateDistance(int x1, int y1, int x2, int y2){ return sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2)); } bool compareDistance(pair p1, pair p2){ return calculateDistance(p1.first.x, p1.first.y, p1.second.x, p1.second.y) < calculateDistance(p2.first.x, p2.first.y, p2.second.x, p2.second.y); } void solve(vector houses){ const int n = houses.size(); vector > points; vector distances; vector flag(n, false); vector index(n * (n - 1) / 2); vector combinations; for(int i = 0; i < index.size(); i++){ index[i] = i; } createCombinations(index, "", 0, n * (n - 1) / 2, n / 2, combinations); for(int i = 0; i < n; i++){ for(int j = i + 1; j < n; j++){ points.push_back({houses[i], houses[j]}); } } for(int i = 0; i < n * (n - 1) / 2; i++){ distances.push_back(calculateDistance(points[i].first.x, points[i].first.y, points[i].second.x, points[i].second.y)); } int pair; bool valid; double sum = 10e9, temp = 0; for(int i = 0; i < combinations.size(); i++){ fill(flag.begin(), flag.end(), false); temp = 0; valid = true; stringstream ss(combinations[i]); while(ss >> pair){ if(!flag[points[pair].first.index] && !flag[points[pair].second.index]){ temp += distances[pair]; flag[points[pair].first.index] = true; flag[points[pair].second.index] = true; }else{ valid = false; break; } } if(valid){ sum = min(sum, temp); } ss.clear(); } cout << fixed << setprecision(2) << sum << " "; } int main(){ int n, x, y, index; vector houses; string temp; getline(cin, temp); stringstream stream(temp); while(stream >> n){ index = 0; houses.reserve(2 * n); for(int i = 0; i < 2 * n; i++){ stream >> x >> y; Point p(x, y, index++); houses.push_back(p); } solve(houses); houses.clear(); } return 0; }