3 1.0 1.0 2.0 2.0 2.0 4.0
3.41
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
const int INF=103;
double G[INF][INF];
int vis[INF];
double low[INF];
double res,n;
using namespace std;
struct Edge
{
double x,y;
} per[INF];
double cacu(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double prim()
{
res=0;
memset(vis,0,sizeof(vis));
vis[0]=1;
for(int i=1; i<n; i++)
low[i]=G[0][i];
for(int i=1; i<n; i++)
{
double MIN=0x1f1f1f1f;
int loc;
for(int j=0; j<n; j++)
{
if(!vis[j]&&MIN>low[j])
{
MIN=low[j];
loc=j;
}
}
res+=MIN;
vis[loc]=1;
for(int k=0; k<n; k++)
{
if(!vis[k]&&low[k]>G[loc][k])
{
low[k]=G[loc][k];
}
}
}
return res;
}
int main()
{
while(cin>>n)
{
for(int i=0; i<n; i++)
{
cin>>per[i].x>>per[i].y;
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
G[i][j]=cacu(per[i].x,per[i].y,per[j].x,per[j].y);
}
}
printf("%.2lf\n",prim());
}
return 0;
}
原文:http://blog.csdn.net/lsgqjh/article/details/46447485