最小生成树就是求,最短路!每个点之间必须是联通的!可以是最短路径,也可以是最少花费!
#include <iostream>
#include <cstdio>#include <cstring>
#include <cmath>
const int maxn=105;
const int MAX=10000;
double map[maxn][maxn];
double dist[maxn];
bool isvisit[maxn];
typedef struct node
{
double x;
double y;
}node;
void init()
{
int i,j;
for(i=0; i<maxn; i++)
{
for(j=0; j<maxn; j++)
{
if(i==j)map[i][j]=0;
map[i][j]=MAX;
}
}
}
double caculat(node a, node b)
{
double len;
len=sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y));
return len;
}
double prim(int n)
{
int i,j,pos,min;
double sum=0;
memset(isvisit,false,sizeof(isvisit));
for(i=1; i<=n ;i ++)
dist[i]=map[1][i];
isvisit[1]=true;
dist[1]=MAX;
for(i=1; i<n; i++)
{
min=MAX;
for(j=1; j<=n; j++)
{
if(!isvisit[j]&&min>dist[j])
{
min=dist[j];
pos=j;
}
}
isvisit[pos]=true;
sum+=dist[pos];
for(j=1; j<=n; j++)
{
if(!isvisit[j]&&dist[j]>map[pos][j])
{
dist[j]=map[pos][j];
}
}
}
return sum;
}
int main()
{
node p[maxn];
int n,i,j;
double sum,len;
while(scanf("%d",&n)!=EOF)
{
init();
for(i=1; i<=n; i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
}
for(i=1; i<n; i++)
{
for(j=i+1; j<=n; j++)
{
len=caculat(p[i],p[j]);
map[i][j]=map[j][i]=len;
}
}
sum=prim(n);
printf("%.2lf\n",sum);
}
return 0;
}