luoguP1265公路修建

最小生成树模板题

重点是规则2的证明

规则2满足条件
1.AB<=AC;
2.BC<=CA;
3.CA<=CB;
若1、2、3均成立,则
AB=AC=BC

以上证明可以说明:规则2成立是A,B,C形成一个等边三角形

由于规则2成立时:政府将否决其中最短的一条公路的修建申请
但是ABC是一个等边三角形
所以否决那一条边都是一样的

总之规则2对题目无影响

小问题

由于于空间的限制上, 5000 * 5000的空间大小会MLE

那么我们发现题目给的是坐标,所以我们想到可以不直接存储距离,而是在Prim的运行流程中把距离即时计算出来即可。
PS:
Prim算法
Kruskal

Code

#include<bits/stdc++.h>
#define maxn 5005
using namespace std;
int n;
double x[maxn];
double y[maxn];
double d[maxn];
double ans;
bool vis[maxn];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lf%lf",&x[i],&y[i]);
	}
	memset(d,0x7f,sizeof(d));
	d[1]=0;
	for(int i=1;i<=n;i++){
		int k=0;
		for(int j=1;j<=n;j++){
			if(!vis[j]&&d[j]<d[k])k=j;
		}
		vis[k]=true;
		for(int j=1;j<=n;j++){
			double s=(x[k]-x[j])*(x[k]-x[j])+(y[k]-y[j])*(y[k]-y[j]);
			if(!vis[j]&&s<d[j])d[j]=s;
		}
	}
	for(int i=1;i<=n;i++){
		ans+=sqrt(d[i]);
	}
	printf("%.2lf\n",ans);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值