题目大意:
给n个城市的坐标,计算连接这N个城市所需线路长度总和的最小值。
解题思路:
最小生成树,prim算法的应用
代码如下:
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
typedef struct
{
bool b;
double x,y;
}no;
int n;
no node[110];
double map[110][110];
double prim()
{
int i,j,nd1,nd2,num;
double lenn=0,max;
node[0].b=true;
num=1;
while(num<n)
{
max=10000000;
for(i=0;i<n;i++)
{
if(node[i].b)
{
for(j=0;j<n;j++)
{
if(node[j].b) continue;
else if(map[i][j]<max)
{
max=map[i][j];nd1=i;nd2=j;
}
}
}
}
num++;
node[nd2].b=true;
lenn+=map[nd1][nd2];
}
return lenn;
}
int main()
{
int count=0;
scanf("%d",&n);
while(n)
{
count++;
int i,j;
for(i=0;i<n;i++)
{
scanf("%lf%lf",&node[i].x,&node[i].y);
node[i].b=false;
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
double temp;
temp=(node[i].x-node[j].x)*(node[i].x-node[j].x)+(node[i].y-node[j].y)*(node[i].y-node[j].y);
temp=sqrt(temp);
map[i][j]=map[j][i]=temp;
}
}
printf("Case #%d:\n",count);
printf("The minimal distance is: %.2lf\n",prim());
scanf("%d",&n);
if(n)
printf("\n");
}
return 0;
}