AC,但是疑惑
查看原帖
AC,但是疑惑
838926
very_easy楼主2023/12/3 17:12

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,有没有大佬能解释一下是为什么?

2023/12/3 17:12
加载中...