PS:这题跟剑鱼一点关系都没有。
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。通过预处理求出距离就可以了。
在循环的最后判断mi的值,直接累加即可。就不用加入minn数组最后循环累加。
上代码
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
double n,a[101][3],g[101][101],ans,mi=0x3f3f3f3f;
int tj;
bool f[101];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i][1]>>a[i][2];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
/*预处理求距离*/
g[i][j]=sqrt(pow(a[i][1]-a[j][1],2)+pow(a[i][2]-a[j][2],2));
}
}
f[1]=1;
for(int k=1;k<=n-1;k++)
{
mi=0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
if(f[i])
{
for(int j=1;j<=n;j++)
{
if (!f[j])
{
if (g[i][j]<mi&&g[i][j]!=0)
{
mi=g[i][j];
tj=j;
}
}
}
}
}
if(mi!=0x3f3f3f3f)
{
ans+=mi;
f[tj]=1;
}
}
cout<<setprecision(2)<<fixed<<ans;
return 0;
}
/*
5
0 0
0 1
1 1
1 0
0.5 0.5
*/
剧终