#include #include #include #include #include #include #include #include #include #include using namespace std; int main() { int i, j, k; int stackNum = 0; int stackSize = 0; int numBuildings; int chosenBuilding; float Xcoord, Ycoord; float tempDis, maxDis, totDis; vector X, Y; vector in; vector< stack > out; stack tempStack; out.push_back(tempStack); out.push_back(tempStack); while(1) { cin >> numBuildings; if(numBuildings == 0){ break; } totDis = 0; for(i = 0; i < numBuildings; i++) { cin >> Xcoord >> Ycoord; X.push_back(Xcoord); Y.push_back(Ycoord); out[stackNum].push(i); } in.push_back(out[stackNum].top()); out[stackNum].pop(); for(i = 0; i < numBuildings-1; i++) { maxDis = -1; for(j = 0; j < in.size(); j++) { stackSize = out[stackNum].size(); for(k = 0; k < stackSize; k++) { tempDis = sqrt(pow((X[in[j]] - X[out[stackNum].top()]), 2) + pow((Y[in[j]] - Y[out[stackNum].top()]), 2)); if(tempDis < maxDis || maxDis == -1){ maxDis = tempDis; chosenBuilding = out[stackNum].top(); } if(stackNum == 0){ out[stackNum+1].push(out[stackNum].top()); out[stackNum].pop(); } else { out[stackNum-1].push(out[stackNum].top()); out[stackNum].pop(); } } if(stackNum == 0){ stackNum = 1; } else { stackNum = 0; } } totDis += maxDis; stackSize = out[stackNum].size(); for(k = 0; k < stackSize; k++) { if(out[stackNum].top() == chosenBuilding){ in.push_back(out[stackNum].top()); out[stackNum].pop(); } else { if(stackNum == 0){ out[stackNum+1].push(out[stackNum].top()); out[stackNum].pop(); } else { out[stackNum-1].push(out[stackNum].top()); out[stackNum].pop(); } } } if(stackNum == 0){ stackNum = 1; } else { stackNum = 0; } } cout << fixed << setprecision(2) << totDis << endl; while(!out[0].empty()){ out[0].pop(); } while(!out[1].empty()){ out[1].pop(); } in.clear(); X.clear(); Y.clear(); } return 0; }