蒟蒻求助
查看原帖
蒟蒻求助
335094
Lucifero楼主2020/7/29 17:29
#include <bits/stdc++.h>
using namespace std;
class Edge
{
public:
	long long l,r;
	double val;
}eline[40000000];
double X[200000],Y[200000],n,ans;
long long father[200000],cnt,l;
bool operator<(Edge L,Edge R)
{
	return L.val<R.val;
}
long long root(long long node)
{
	return father[node]==node?node:father[node]=root(father[node]);
}
void tree_add(long long u,long long v,double w)
{
	l++;
	eline[l].l=u;
	eline[l].r=v;
	eline[l].val=w*1.0;
}
double walk(long long i,long long j)
{
	double fx=(X[i]-X[j])*1.0,fy=(Y[i]-Y[j])*1.0;
	return pow(fx*fx+fy*fy,0.5);
}
void kruskal(long long k)
{
	for(k;k<=l;k++)
	{
		long long fx=root(eline[k].l),fy=root(eline[k].r);
		if (fx!=fy)
		{
			father[fx]=fy;
			ans+=eline[k].val*1.0;
			cnt++;
		}
		if (cnt==n-1) return;
	}
}
int main()
{
	//最小生成树2
	long long i,j;
	scanf("%lf",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%lf%lf",&X[i],&Y[i]);
		father[i]=i;
	}
	for(i=1;i<=n-1;i++)
		for(j=i+1;j<=n;j++)
			tree_add(i,j,walk(i,j));
	sort(eline+1,eline+l+1);
	kruskal(1);
	printf("%lf",ans);
}

评测机炸了,全 MLE,还有正在评测中的,估计是没希望了。

蒟蒻刚学生成树

2020/7/29 17:29
加载中...