#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node
{
int x;
int y;
}node[10];
struct Ans
{
double goal;
int i;
}ans[41000]; //i为全排列中的编号,goal为得到的结果,用编号来获得全排列中对应的序列
bool cmp(const Ans a,const Ans b)
{
return a.goal<b.goal;
}
int a[10];
int main()
{
int tol=0;
int n;
double sum;
int tol1;
while(scanf("%d",&n)==1&&n)
{
tol1=0;
sum=0;
for(int i=1;i<=n;i++)
scanf("%d%d",&node[i].x,&node[i].y);
if(n==1)
{printf("**********************************************************\nNetwork #%d\n",++tol);
printf("Number of feet of cable required is 0.00.\n");
continue;}
for(int i=0;i<n;i++)
a[i]=i+1;
double k;
for(int i=0;i<n-1;i++)
{
k=sqrt(pow(node[a[i]].x-node[a[i+1]].x,2)+pow(node[a[i]].y-node[a[i+1]].y,2));
// printf("%.2f",k);
sum+=k;
}
//printf("%.2f\n",sum);
ans[tol1].goal=sum;
ans[tol1].i=tol1+1;
tol1++; //
while(next_permutation(a,a+n))
{
sum=0;
for(int i=0;i<n-1;i++)
{
k=sqrt((pow(node[a[i]].x-node[a[i+1]].x,2)+pow(node[a[i]].y-node[a[i+1]].y,2)));
sum+=k;
}
ans[tol1].goal=sum;
ans[tol1].i=tol1+1;
tol1++;
}
printf("**********************************************************\nNetwork #%d\n",++tol);
sort(ans,ans+tol1,cmp);
for(int i=0;i<n;i++)
a[i]=i+1;
if(ans[0].i==1)
for(int j=0;j<n-1;j++)
{
double r=sqrt((pow(node[a[j]].x-node[a[j+1]].x,2)+pow(node[a[j]].y-node[a[j+1]].y,2)));
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2f feet.\n",node[a[j]].x,node[a[j]].y,node[a[j+1]].x,node[a[j+1]].y,r+16);
}
else
{
int k1=1;
while(next_permutation(a,a+n))
{
k1++;
if(ans[0].i==k1)break;
}
for(int j=0;j<n-1;j++)
{
double r=sqrt((pow(node[a[j]].x-node[a[j+1]].x,2)+pow(node[a[j]].y-node[a[j+1]].y,2)));
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2f feet.\n",node[a[j]].x,node[a[j]].y,node[a[j+1]].x,node[a[j+1]].y,r+16);
}
}
printf("Number of feet of cable required is %.2f.\n",ans[0].goal+16*(n-1));
}
return 0;
}
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node
{
int x;
int y;
}node[10];
struct Ans
{
double goal;
int i;
}ans[41000]; //i为全排列中的编号,goal为得到的结果,用编号来获得全排列中对应的序列
bool cmp(const Ans a,const Ans b)
{
return a.goal<b.goal;
}
int a[10];
int main()
{
int tol=0;
int n;
double sum;
int tol1;
while(scanf("%d",&n)==1&&n)
{
tol1=0;
sum=0;
for(int i=1;i<=n;i++)
scanf("%d%d",&node[i].x,&node[i].y);
if(n==1)
{printf("**********************************************************\nNetwork #%d\n",++tol);
printf("Number of feet of cable required is 0.00.\n");
continue;}
for(int i=0;i<n;i++)
a[i]=i+1;
double k;
for(int i=0;i<n-1;i++)
{
k=sqrt(pow(node[a[i]].x-node[a[i+1]].x,2)+pow(node[a[i]].y-node[a[i+1]].y,2));
// printf("%.2f",k);
sum+=k;
}
//printf("%.2f\n",sum);
ans[tol1].goal=sum;
ans[tol1].i=tol1+1;
tol1++; //
while(next_permutation(a,a+n))
{
sum=0;
for(int i=0;i<n-1;i++)
{
k=sqrt((pow(node[a[i]].x-node[a[i+1]].x,2)+pow(node[a[i]].y-node[a[i+1]].y,2)));
sum+=k;
}
ans[tol1].goal=sum;
ans[tol1].i=tol1+1;
tol1++;
}
printf("**********************************************************\nNetwork #%d\n",++tol);
sort(ans,ans+tol1,cmp);
for(int i=0;i<n;i++)
a[i]=i+1;
if(ans[0].i==1)
for(int j=0;j<n-1;j++)
{
double r=sqrt((pow(node[a[j]].x-node[a[j+1]].x,2)+pow(node[a[j]].y-node[a[j+1]].y,2)));
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2f feet.\n",node[a[j]].x,node[a[j]].y,node[a[j+1]].x,node[a[j+1]].y,r+16);
}
else
{
int k1=1;
while(next_permutation(a,a+n))
{
k1++;
if(ans[0].i==k1)break;
}
for(int j=0;j<n-1;j++)
{
double r=sqrt((pow(node[a[j]].x-node[a[j+1]].x,2)+pow(node[a[j]].y-node[a[j+1]].y,2)));
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2f feet.\n",node[a[j]].x,node[a[j]].y,node[a[j+1]].x,node[a[j+1]].y,r+16);
}
}
printf("Number of feet of cable required is %.2f.\n",ans[0].goal+16*(n-1));
}
return 0;
}