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
套模板!
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstdio>
using namespace std;
long long n;
double m;
double a[101][101],minn[10000];
bool u[1000];
int main(){
cin>>n;
double x[10000],y[10000];
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
for(int j=1;j<n;j++){
a[i][j]=sqrt((abs(x[i]-x[j]))*(abs(x[i]-x[j]))+(abs(y[i]-y[j]))*(abs(y[i]-y[j])));
a[j][i]=a[i][j];
}
}
memset(u,1,sizeof(u));
memset(minn,100.0,sizeof(minn));
minn[1]=0.0;
for(int i=1;i<=n-1;i++){
int 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]&&a[k][j]<minn[j])
minn[j]=a[k][j];
}
for(int i=1;i<=n;i++)
m+=minn[i];
printf("%0.2lf",m);//这里让我改了半个钟,再也不用setprecision了
}