[luogu1265]公路修建
Posted neworld2002
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[luogu1265]公路修建相关的知识,希望对你有一定的参考价值。
你会发现第二条规则不存在,因为在形成环之前,这几个城市就已经连通了。所以直接求最小生成树即可。
然后你会发现,边数特别多,所以Kruskal会TLE,并且开邻接表存图会MLE
所以干脆直接Prim了,因为是完全图,所以每个点对其他点都有边,那么直接遍历即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define MAXN 5005
struct Node{
int x,y;
}E[MAXN];
double dis[MAXN];
bool vis[MAXN];
inline double diss(Node a,Node b){
return sqrt((double)(a.x-b.x)*(a.x-b.x)+(double)(a.y-b.y)*(a.y-b.y));
}
int N;
int main(){
std::memset(vis,false,sizeof(false));
scanf("%d",&N);
for(register int i=1;i<=N;++i){
scanf("%d%d",&E[i].x,&E[i].y);
dis[i] = 2147483647;
}
dis[1] = 0;
double ans = 0;
for(register int i=1;i<=N;++i){
int u;
double minn = 2147483647;
for(register int j=1;j<=N;++j){
if(!vis[j]&&dis[j]<minn){
minn = dis[j];
u = j;
}
}
vis[u] = true;
ans += dis[u];
for(register int j=1;j<=N;++j){
if(!vis[j]&&dis[j]>diss(E[u],E[j])){
dis[j] = diss(E[u],E[j]);
}
}
}
printf("%.2lf",ans);
return 0;
}
以上是关于[luogu1265]公路修建的主要内容,如果未能解决你的问题,请参考以下文章