/*
推荐题型:三星,有技巧要掌握,顺序数组存储状态
题意:每台电脑上之间铺上电缆,问电缆最短为多少
思路:深度优先搜索,递归中使用形参存储搜索状态
*/
#include <cstdio>
#include <cmath>
#include <cstring>
struct node
{
int x,y;
}com[10];
double G[10][10],res;
bool visit[10];
int next[10],ans[10];
int n,u;
void dfs(int sta,int cur,int k,double num)
{
if(k==n)
{
if(num<res)
{
u=sta;
res=num;
memcpy(ans,next,sizeof(next));
}
}
visit[cur]=1;
for(int i=0;i<n;i++)
if(!visit[i])
{
next[cur]=i;
dfs(sta,i,k+1,num+G[cur][i]);
next[cur]=-1;
}
visit[cur]=0;
}
int main()
{
//freopen("data.in","r",stdin);
int cas=1;
while(scanf("%d",&n) && n)
{
for(int i=0;i<n;i++)
scanf("%d %d",&com[i].x,&com[i].y);
memset(G,0,sizeof(G));
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
// if(i!=j)
{
double temp=pow((double)(com[i].x-com[j].x),2)+pow((double)(com[i].y-com[j].y),2);
temp=sqrt(temp)+16;
G[i][j]=G[j][i]=temp;
}
res=1e10;
memset(next,-1,sizeof(next));
memset(visit,0,sizeof(visit));
for(int i=0;i<n;i++)//WA原因,直接从0开始搜索,注意:开头处不同结果也可能不同
dfs(i,i,1,0);
printf("**********************************************************\nNetwork #%d\n",cas++);
while(ans[u]!=-1)
{
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",com[u].x,com[u].y,com[ans[u]].x,com[ans[u]].y,G[u][ans[u]]);
u=ans[u];
}
printf("Number of feet of cable required is %.2lf.\n",res);
}
}
/*
使用一个顺序数组temp做存储更方便些
*/
#include <cstdio>
#include <cmath>
#include <cstring>
struct node
{
int x,y;
}com[10];
double G[10][10],res;
bool visit[10];
int temp[10],ans[10];
int n,u;
void dfs(int k,double num)
{
if(k==n-1)
{
if(num<res)
{
res=num;
memcpy(ans,temp,sizeof(temp));
}
}
visit[temp[k]]=1;
for(int i=0;i<n;i++)
if(!visit[i])
{
temp[k+1]=i;
dfs(k+1,num+G[temp[k]][i]);
}
visit[temp[k]]=0;
}
int main()
{
//freopen("data.in","r",stdin);
int cas=1;
while(scanf("%d",&n) && n)
{
for(int i=0;i<n;i++)
scanf("%d %d",&com[i].x,&com[i].y);
memset(G,0,sizeof(G));
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
// if(i!=j)
{
double temp=pow((double)(com[i].x-com[j].x),2)+pow((double)(com[i].y-com[j].y),2);
temp=sqrt(temp)+16;
G[i][j]=G[j][i]=temp;
}
res=1e10;
memset(visit,0,sizeof(visit));
for(int i=0;i<n;i++)//WA原因,直接从0开始搜索,注意:开头处不同结果也可能不同
{
temp[0]=i;
dfs(0,0);
}
printf("**********************************************************\nNetwork #%d\n",cas++);
for(int i=0;i<n-1;i++)
{
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",com[ans[i]].x,com[ans[i]].y,com[ans[i+1]].x,com[ans[i+1]].y,G[ans[i]][ans[i+1]]);
}
printf("Number of feet of cable required is %.2lf.\n",res);
}
}