题意:
平面上给定几个点,求将这几个点联通起来的最小生成树,并输出最小生成树每条边的权值和总的最小代价。
思路:
因为点数最多为8所以没用最小生成树,而是直接穷举起点然后进行dfs求出一颗最小生成树。
注意:
注意输出格式,然后对自己定义的数组要明确含义。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef struct
{
int x,y;
}P;
P p[10],p1;
int ans[10],n,vis[10],temp[10];
double sum;
double dist(P p1, P p2)
{
double x=(p1.x-p2.x)*(p1.x-p2.x);
double y=(p1.y-p2.y)*(p1.y-p2.y);
return sqrt(x+y);
}
void dfs(int x,int num,double len)
{
int i;
if(num==n)
{
if(sum>len)
{
sum=len;
for(i=0;i<n;i++)
ans[i]=temp[i];
}
return ;
}
for(i=0;i<n;i++)
{
if(!vis[i])
{
vis[i]=1;
temp[num]=i;
dfs(i,num+1,len+dist(p[x],p[i]));
vis[i]=0;
}
}
}
int main()
{
int i,j,k,Case=0;
while(scanf("%d",&n)&&n)
{
sum=1000000+0.0;
for(i=0;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
for(i=0;i<n;i++)
{
memset(vis,0,sizeof(vis));
vis[i]=1; temp[0]=i;
dfs(i,1,0);
}
printf("**********************************************************\n");
printf("Network #%d\n",++Case);
for(i=1;i<n;i++)
{
double len=dist(p[ans[i-1]],p[ans[i]]);
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",
p[ans[i-1]].x,p[ans[i-1]].y,p[ans[i]].x,p[ans[i]].y,len+16);
}
printf("Number of feet of cable required is %.2lf.\n",sum+(n-1)*16);
}
return 0;
}