剑鱼行动
Time Limit:10000MS Memory Limit:65536K
Total Submit:151 Accepted:118
Case Time Limit:1000MS
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。通过预处理求出 两点间距离距离 就可以了。
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<iomanip>
using namespace std;
int n,v[200],k;
double f[200][200],ans,minn[200],a[200][3];
int main(){
scanf("%d",&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++)
f[i][j]=sqrt(pow(a[i][1]-a[j][1],2)+pow(a[i][2]-a[j][2],2));
memset(minn,0X7f,sizeof(minn));
minn[1]=0.0;
for(int i=1;i<=n;i++)
{
k=0;
for(int j=1;j<=n;j++)
if(!v[j]&&minn[j]<minn[k])
k=j;
v[k]=1;
for(int j=1;j<=n;j++)
if(!v[j]&&f[k][j]<minn[j])
minn[j]=f[k][j];
}
for(int i=1;i<=n;i++)
ans+=minn[i];
cout<<fixed<<setprecision(2)<<ans;
}