最小生成树模板题
重点是规则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;
}