Description
给出N个点的坐标,对它们建立一个最小生成树,代价就是连接它们的路径的长度,现要求总长度最小。N的值在100以内,坐标值在[-10000,10000].结果保留二位小数
Input
5 ---------------5个点
0 0 ---------------5个点的坐标
0 1
1 1
1 0
0.5 0.5
Output
2.83
分析
这道题也算是一道模板题,但要注意数组开double。由于输入坐标,还要根据求距离公式预处理出点与点之间的距离,最后累加即可。
CODE
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cmath>
using namespace std;
int n,k;
double x[1001],y[1001],minn[1001],g[1001][1001],tot;
bool u[1001];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i];
for(int j=1;j<=n;j++)
{
g[i][j]=sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2)); //预处理求出距离
g[j][i]=g[i][j];
}
}
memset(minn,0x7f,sizeof(minn));
minn[1]=0.0;
memset(u,1,sizeof(u));
for(int i=1;i<=n;i++)
{
k=0;
for(int j=1;j<=n;j++)
if(u[j]&&minn[j]<minn[k])
k=j;
u[k]=0;
for(int j=1;j<=n;j++)
if(u[j]&&g[k][j]<minn[j])
minn[j]=g[k][j];
}
for(int i=1;i<=n;i++)
{
tot+=minn[i]; //累加每条最短路
}
cout<<fixed<<setprecision(2)<<tot;
return 0;
}
/*
5
0 0
0 1
1 1
1 0
0.5 0.5
*/