枚举给定点的坐标间距离和的最小值~~数据量小,暴力枚举即可~~
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef struct _Point{
int xx,yy;
}Point;
Point point[10];
int perm[10],res_perm[10];
double res_dist[10];
int main()
{
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int xx,yy;
int n;
int cc = 0;
while(scanf("%d",&n)==1&&n)
{
double min = 99999999.999;
for(int i = 0;i < n;i++)
scanf("%d %d",&point[i].xx,&point[i].yy);
for(int i = 0;i < n;i++) perm[i] = i;
while(next_permutation(perm,perm+n))
{
double dist[n-1];
for(int i = 1;i < n;i++)
{
dist[i-1] = 16+sqrt((point[perm[i]].xx-point[perm[i-1]].xx)*(point[perm[i]].xx-point[perm[i-1]].xx)
+(point[perm[i]].yy-point[perm[i-1]].yy)*(point[perm[i]].yy-point[perm[i-1]].yy));
}
double cable = 0;
for(int i = 0;i < n-1;i++)
cable += dist[i];
if(cable < min)
{
min = cable;
for(int i = 0;i < n;i++){res_perm[i]=perm[i];}
for(int i = 0;i < n-1;i++){res_dist[i]=dist[i];}
}
}
printf("**********************************************************\n");
printf("Network #%d\n",++cc);
for(int i = 0;i < n-1;i++)
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",point[res_perm[i]].xx,point[res_perm[i]].yy,point[res_perm[i+1]].xx,point[res_perm[i+1]].yy,res_dist[i]);
printf("Number of feet of cable required is %.2lf.\n",min);
}
return 0;
}