有一个点MLE是什么情况?
查看原帖
有一个点MLE是什么情况?
164840
zhaowangji楼主2020/7/29 16:42

已经看了题解改了一部分代码。使用克鲁斯卡尔求最小生成树。坐标开了 long long 是因为之前有一篇讨论说坐标要用 long long 读

#include<bits/stdc++.h>
using namespace std;
int n,m;
struct coordinate{
	long long dx,dy;
}s[1007];
int fa[1007],fa_[1007];
struct edge{
	int x,y;
	int dis;
}e[10000007];
int num;
int now_edge;
double ans;
int fi(int x){
	if(fa[x]!=x)fa[x]=fi(fa[x]);
	return x;
}
void hb(int x,int y){
	fa[x]=y;
	return;
}
int dis(long long dx1,long long dy1,long long dx2,long long dy2){
	return ((dx1-dx2)*(dx1-dx2)+(dy1-dy2)*(dy1-dy2));
}
bool cmp(edge x,edge y){
	return x.dis<y.dis;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i){
		cin>>s[i].dx>>s[i].dy;
		fa[i]=i;
	}
	for(int i=1;i<=m;++i){
		int u,v;cin>>u>>v;
		e[++num].x=u;e[num].y=v;
		e[num].dis=0;
	}
	for(int i=1;i<=n;++i)
	for(int j=i+1;j<=n;++j){
		e[++num].x=i;e[num].y=j;
		e[num].dis=dis(s[i].dx,s[i].dy,s[j].dx,s[j].dy);
	}
	sort(e+1,e+num+1,cmp);
	for(int i=1;i<=num;++i){
		int x=e[i].x,y=e[i].y;
		int fa_x=fi(x),fa_y=fi(y);
		if(fa_x!=fa_y){
			hb(fa_x,fa_y);
			ans+=(double)sqrt((double)e[i].dis);
			++now_edge;
			if(now_edge==n-1)break;
		}
	}
	cout<<fixed<<setprecision(2)<<ans<<"\n";
	return 0;
}
2020/7/29 16:42
加载中...