题目链接:点击打开链接
prim算法模板题,需要自己求一下距离,还有一种方法是距离都保存x*x+y*y,10和1000比较时也相应的平方,这样保证前面都是整数运算,输出时在开方乘100。
大于10小于1000看成了大于等于小于等于,wa了n次
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
struct node{
int x,y;
node(){}
node(int x,int y):x(x),y(y){}
node operator - (node k){
return node(x-k.x,y-k.y);
}
}p[105];
double a[105][105];
double dis[105];
bool vis[105];
double res;
const double inf=10000000;
const double eps=1e-7;
double len(node a,node b){
node t=a-b;
return pow(double(t.x*t.x)+double(t.y*t.y),0.5);
}
bool prim(int n){
for(int i=1;i<=n;i++){
vis[i]=0;
dis[i]=inf;
}
res=0;dis[1]=0;
for(int i=1;i<=n;i++){
double tmp=inf;int k=0;
for(int j=1;j<=n;j++){
if(!vis[j]&&tmp>dis[j]){
tmp=dis[j];
k=j;
}
}
if(fabs(tmp-inf)<eps) {
return 0;
}
res+=tmp;
vis[k]=1;
for(int j=1;j<=n;j++){
if(!vis[j]&&dis[j]>a[k][j])
dis[j]=a[k][j];
}
}
return 1;
}
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>p[i].x>>p[i].y;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]=len(p[i],p[j]);
if(i==j) a[i][j]=0;
else if(a[i][j]>1000||a[i][j]<10)
a[i][j]=inf;
}
}
if(prim(n))printf("%.1lf\n",res*100);
else cout<<"oh!"<<endl;
}
return 0;
}