最小生成树prim算法,MLE 80pts求助
查看原帖
最小生成树prim算法,MLE 80pts求助
649262
zyxxxxxxxxxx楼主2023/10/8 18:34

rt,代码如下

#include<bits/stdc++.h>
using namespace std;
int n;
long long e[5005][5005];
double dist[5005];
int f[5005];
int a[5005][4];
double prim(){
	int k=1;
	f[1]=1;
	double s=0;
	for(int i=1;i<=n;i++){
		dist[i]=1e18;
	}
	for(int j=1;j<=n-1;j++){	
		for(int i=1;i<=n;i++){
			if(dist[i]==1e18){
				dist[i]=sqrt(e[k][i]);
			}else{
				dist[i]=min(dist[i],sqrt(e[k][i]));
			}
		}
		double minn=1e18;
		for(int i=1;i<=n;i++){
			if(f[i]==0&&dist[i]<minn){
				minn=dist[i];
				k=i;
			}
		}
		s+=minn;
		f[k]=1;
	}
	return s;
}
int  main(){
	cin>>n;
	int x,y;
	for(int i=1;i<=n;i++){
//		cin>>a[i][0]>>a[i][1];
		scanf("%lld%lld",&a[i][0],&a[i][1]);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			e[i][j]=pow(a[i][0]-a[j][0],2)+pow(a[i][1]-a[j][1],2);
			e[j][i]=e[i][j];
		}
	}
	double ans=prim();
	printf("%.2lf",ans);
	return 0;
}
2023/10/8 18:34
加载中...