萌新求助primWA
查看原帖
萌新求助primWA
467906
Anyakwi楼主2022/7/23 10:50
#include<cstdio>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>

using namespace std;

const int maxn=1e3+5;

int n,m,now;
double ans;
struct node{
	double x,y;
}t[maxn];

int cnt;
int head[maxn],to[maxn<<1],pre[maxn<<1];
void link(int a,int b)
{
	to[++cnt]=b;
	pre[cnt]=head[a];
	head[a]=cnt;
}

double dis[maxn];
int vis[maxn];
void prim(){
	for(int i=1;i<=n;i++)
	{
		if(i==now) continue;
		dis[i]=0x7fffffff;
	}
	double x2=t[now].x,y2=t[now].y;
	for(int i=1;i<=n;i++)
	{
		if(vis[i]) continue;
		else{
			double x1=t[i].x,y1=t[i].y;
			double tmp=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
			dis[i]=min(dis[i],tmp);
		}
	}
	for(int tot=m+1;tot<n;tot++)
	{
		vis[now]=1;
		int minn=0x7fffffff;
		for(int i=1;i<=n;i++)
		{
			if(!vis[i]&&dis[i]<minn)
			{
				minn=dis[i];
				now=i;
			}
		}
		ans+=minn;
		x2=t[now].x,y2=t[now].y;
		for(int i=1;i<=n;i++)
		{
			if(!vis[i])
			{
				double x1=t[i].x,y1=t[i].y;
				double tmp=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
				dis[i]=min(dis[i],tmp);
			}
		}
	}
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>t[i].x>>t[i].y;
	for(int i=1;i<=m;i++)
	{
		int a,b;
		cin>>a>>b;
		link(a,b);
		link(b,a);
		vis[a]=1,vis[b]=1;
		now=a;
	}
	prim();
	printf("%.2lf",ans);
	return 0;
}

2022/7/23 10:50
加载中...