0pts真不错
  • 板块灌水区
  • 楼主ACtheQ
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/13 22:48
  • 上次更新2023/11/3 03:59:52
查看原帖
0pts真不错
755689
ACtheQ楼主2023/8/13 22:48

P2872

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int x[N],y[N];
int fa[N];
int n,m;
int tmp;
double dist(int i,int j)
{
	return (double)sqrt((double)(x[i]-x[j])*(x[i]-x[j])+(double)(y[i]-y[j])*(y[i]-y[j]));
}
struct Node
{
	int u;
	int v;
	double w;	
}edg[N];
int findRT(int x)
{
	if(fa[x]==x) return fa[x];
	return fa[x]=findRT(fa[x]);	
}
bool cmp(Node x,Node y)
{
	return x.w<y.w;
}
double kruskal()
{
	sort(edg+1,edg+tmp+1,cmp);
	for(int i=1;i<=n;i++) fa[i]=i;
	double sum=0;
	int cnt=0;
	for(int i=1;i<=tmp;i++) 
	{
		if(findRT(edg[++cnt].u)!=findRT(edg[cnt].v)) 
		{
			sum+=edg[cnt].w;
			if(edg[cnt].u==edg[cnt].v) continue;
			fa[edg[cnt].u]=edg[cnt].v;
		}
	}
	return sum;
} 
int main()
{	
	cin>>n>>m;
	for(int i=1;i<=n;i++) 
	{
		cin>>x[i]>>y[i];
		fa[i]=i;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++) edg[++tmp]=Node{i,j,dist(i,j)}; 
	}
	for(int i=1;i<=m;i++) 
	{
		int x,y;
		cin>>x>>y;
		edg[++tmp]=Node{x,y,0}; 
	}
	printf("%.2lf",kruskal());
	return 0;
}
2023/8/13 22:48
加载中...