题意:给出一个数n,接下来有n个行,每行给出一个点的x坐标和y坐标,求连接每个点的最小消耗。
#include<stdio.h>
#include<math.h>
#include<string.h>
int n;
double dis[101][101];
int vis[101];
double lowcost[101];
int inf=1000000;
typedef struct
{
double x,y;
}point;
double prim()
{
int i,j;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
lowcost[i]=dis[0][i];
vis[0]=1;
double ans=0;
double min;
int k;
for(i=1;i<n;i++)
{
min=inf;
k=0;
for(j=0;j<n;j++)
if(!vis[j]&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
ans+=min;
vis[k]=1;
for(j=0;j<n;j++)
if(!vis[j]&&lowcost[j]>dis[k][j])
lowcost[j]=dis[k][j];
}
return ans;
}
int main()
{
int i,j;
point co[101];
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
dis[i][j]=inf;
for(i=0;i<n;i++)
scanf("%lf %lf",&co[i].x,&co[i].y);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
dis[i][j]=dis[j][i]=sqrt((co[i].x-co[j].x)*(co[i].x-co[j].x)+(co[i].y-co[j].y)*(co[i].y-co[j].y));
double an=prim();
printf("%.2lf\n",an);
}
return 0;
}