先计算出每对顶点的距离,然后就是最小生成树的模板。。。。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define inf 0x3f3f3f3f
double dis[105][105];
double x[105];
double y[105];
double ans;
bool v[105];
double d[105];
int cnt,n;
double calculateDis(double x1,double y1,double x2,double y2)
{
return sqrt(pow(x1 - x2,2) + pow(y1 - y2,2));
}
void prim()
{
for(int i = 0;i < n;++i)
d[i] = dis[0][i];
while(cnt < n)
{
double Min = inf;
int k;
for(int i = 0;i < n;++i)
{
if(!v[i] && d[i] < Min)
{
Min = d[i];
k = i;
}
}
v[k] = true;
cnt++;
ans += d[k];
for(int i = 0;i < n;++i)
{
if(!v[i] && d[i] > dis[k][i])
d[i] = dis[k][i];
}
}
}
int main()
{
while(~scanf("%d",&n))
{
for(int i = 0;i < n;++i)
{
scanf("%lf%lf",&x[i],&y[i]);
}
memset(dis,0,sizeof(dis));
memset(v,false,sizeof v);
for(int i = 0;i < n;++i)
{
for(int j = i + 1;j < n;++j)
{
dis[j][i] = dis[i][j] = calculateDis(x[i],y[i],x[j],y[j]);
}
}
ans = 0;
cnt = 1;
v[0] = true;
prim();
printf("%.2lf\n",ans);
/*for(int i = 0;i < n;++i)
{
for(int j = 0;j < n;++j)
printf("%lf ",dis[i][j]);
printf("\n");
}*/
}
return 0;
}