剑鱼行动
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
分析
这题我们可以套模板——最小生成树
最优布线问题(最小生成树)
还有,这里有个知识点
坐标与坐标之间的距离(勾股定理)
求距离
代码实现
sqrt((abs(x[i]-x[j]))*(abs(x[i]-x[j]))+(abs(y[i]-y[j]))*(abs(y[i]-y[j])));
再用cout<<setprecision(2)<<fixed<<s;就行了
AC代码
prim
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
using namespace std;
int n,k,b[105];
double s,x[105],y[105],m[105],a[105][105];//定义
int main()
{
cin>>n;
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];//将距离也赋值给a[j][i]
}
}
memset(m,0x7f,sizeof(m));
m[1]=0;
for(int i=1;i<=n;i++)//下面直接套模板
{
k=0;
for(int j=1;j<=n;j++)
if(!b[j]&&(m[j]<m[k]))
k=j;
b[k]=1;
for(int j=1;j<=n;j++)
if(!b[j]&&(a[k][j]<m[j]))
m[j]=a[k][j];
}
for(int i=1;i<=n;i++)
s+=m[i];
cout<<setprecision(2)<<fixed<<s;//保留两位小数
}
kruskal
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int n,o,v[105];
double m,s,x[105],y[105],a[105][105];
int main()
{
cin>>n;
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];//将距离也赋值给a[j][i]
}
}
for(int i=1;i<=n;i++)v[i]=i; 下面套模板
for(int k=1;k<=n-1;k++)
{
int x1=0,y1=0;
m=2147483647;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if((v[i]!=v[j])&&(a[i][j]<m)&&(a[i][j]!=0))
{m=a[i][j];x1=i;y1=j;}
s+=m;
double t=v[y1];
for(int i=1;i<=n;i++)
if(v[i]==t)v[i]=v[x1];
}
cout<<setprecision(2)<<fixed<<s;//保留两位
}