10分代码:
#include<bits/stdc++.h>
using namespace std;
const int N=5005;
double x[N],y[N],n,cnt;
double dis[N],ans;
bool vis[N];
double f(int x1,int x2,int y1,int y2){
return sqrt(1.0*(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
void init(){
for(int i=0;i<=n;i++) dis[i]=1e12;
dis[1]=0.00;
}
void prim(){
for(int i=1;i<=n;i++){
if(cnt>=n) return ;
int t=0;
for(int j=1;j<=n;j++){
if(!vis[j]&&dis[j]<dis[t]) t=j;
}
ans+=dis[t];
cnt++;
vis[t]=1;
for(int i=1;i<=n;i++){
if(f(x[t],x[i],y[t],y[i])<dis[i]){
dis[i]=f(x[t],x[i],y[t],y[i]);
}
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
}
init();
prim();
printf("%.2f",ans);
return 0;
}
AC 代码:
#include<bits/stdc++.h>
using namespace std;
const int N=5005;
double x[N],y[N],n,cnt;
double dis[N],ans;
bool vis[N];
double f(double x1,double x2,double y1,double y2){
return sqrt(1.0*(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
void init(){
for(int i=0;i<=n;i++) dis[i]=1e12;
dis[1]=0.00;
}
void prim(){
for(int i=1;i<=n;i++){
if(cnt>=n) return ;
int t=0;
for(int j=1;j<=n;j++){
if(!vis[j]&&dis[j]<dis[t]) t=j;
}
ans+=dis[t];
cnt++;
vis[t]=1;
for(int i=1;i<=n;i++){
if(f(x[t],x[i],y[t],y[i])<dis[i]){
dis[i]=f(x[t],x[i],y[t],y[i]);
}
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
}
init();
prim();
printf("%.2f",ans);
return 0;
}
实际上这两个代码唯一的差别就是在f函数中(当然为保证代码正确性将x数组与y数组也修改了类型),一个是将参数定义为double,另一个就是用*1.0强转,按理说没什么区别,但是却10->100,有没有大佬能解释一下是为什么?