WA30分求调
查看原帖
WA30分求调
561297
AbelTomato楼主2022/7/20 12:43

我用的kruskal搞最小生成树,不知道为啥寄了,大佬看一下吧qwq

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
#define ll long long
#define ull unsigned long long
#define maxn 2001
using namespace std;
struct Edge
{
	int u,v;
	double w;
}edge[maxn];
struct str
{
	int x,y;
}point[maxn];
int n,m;
int cnt;
int fa[maxn];
int num;
double ans;
double dis(int Xa,int Ya,int Xb,int Yb)
{
	return (double)(sqrt((double)(pow(Xa-Xb,2))+(double)(pow(Ya-Yb,2))));
}
void add(int u,int v,double w)
{
	edge[++cnt].u=u;
	edge[cnt].v=v;
	edge[cnt].w=w;
}
bool cmp(Edge x,Edge y)
{
	if(x.w==y.w)
	{
		return x.u<y.u;
	}
	return x.w<y.w;
}
int _find(int x)
{
	if(x==fa[x])
	{
		return x;
	}
	return fa[x]=_find(fa[x]);
}
void _merge(int x,int y)
{
	fa[_find(x)]=_find(y);
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
	}
	for(int i=1;i<=n;i++)
	{
		cin>>point[i].x>>point[i].y;
	}
	for(int i=1;i<n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			double w=dis(point[i].x,point[i].y,point[j].x,point[j].y);
			add(i,j,w);
		}
	}
	for(int i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		add(u,v,0.0);
	}
	sort(edge+1,edge+cnt+1,cmp);
	for(int i=1;i<=cnt;i++)
	{
		int fx=_find(edge[i].u),fy=_find(edge[i].v);
		if(fx!=fy)
		{
			num++;
			ans+=edge[i].w;
			_merge(fx,fy);
		}
		if(num==n-1)
		{
			break;
		}
	}
	cout<<fixed<<setprecision(2)<<ans;
	return 0;
}

2022/7/20 12:43
加载中...