Luogu P1265

本来一开始我用的Kruskal……但是由于double类型8字节,所以MLE了。

很容易发现这是一道最小生成树的题目。

值得注意的是题目中给的第二个限制,只存在唯一情况即这个环为等边多边形。

但是如果是等边多边形那么这个限制给了和没给完全没区别……

所以这就是一道最小生成树裸题。

由于Kruskal需要记录边权进行统计,而题中给的是一个完全图,空间开销很大。

Prim可以在需要的时候进行计算,不需要提前记录,空间开销一般。

事实上这也是Prim算法和Kruskal算法原理上的不同。

Prim算法是以点为中心的算法,Kruskal是以边为中心的算法。

在稀疏图中Kruskal表现优于Prim,但在稠密图和完全图中Prim会更适合。

#include<cstdio>
#include<cmath>
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
long long n,cost[5005],x[5005],y[5005];
bool vis[5005];
double ans;
void First()
{
for (int i=0;i<=n;i++) cost[i]=inf;
cost[1]=0;
}
void Prim()
{
for (int i=1;i<=n;i++)
{
long long mincost=inf,m=0;
for (int j=1;j<=n;j++)
if (mincost>cost[j]&&!vis[j])
{
mincost=cost[j];
m=j;
}
vis[m]=true;
ans+=sqrt(cost[m]);
for (int j=1;j<=n;j++)
if ((x[m]-x[j])*(x[m]-x[j])+(y[m]-y[j])*(y[m]-y[j])<cost[j]&&!vis[j])
cost[j]=(x[m]-x[j])*(x[m]-x[j])+(y[m]-y[j])*(y[m]-y[j]);
}
}
int main()
{
scanf("%lld",&n);
for (int i=1;i<=n;i++)
scanf("%lld%lld",&x[i],&y[i]);
First();
Prim();
printf("%.2f",ans);
return 0;
}

最新文章

  1. MFC单文档程序添加HTML帮助支持
  2. Python中的可迭代对象与迭代器对象
  3. Java Web开发之分页(ajax)
  4. iOS-集成阿里百川IMSDK的服务端及客户端
  5. [转载] 老版本ubuntu 更新源
  6. org.apache.http.ProtocolException: Target host is not specified
  7. 降维(一)----说说主成分分析(PCA)的源头
  8. CI源码引用使用--php引用demo,静态变量和引用关系
  9. ubuntu 增加新硬盘
  10. 14-利用SVD简化数据
  11. 一个web应用的诞生--使用模板
  12. .NET作品集:linux下的.net mvc cms
  13. [ SHELL编程 ] echo和printf使用实例
  14. 2019年微服务实践第一课,网易&amp;谐云&amp;蘑菇街&amp;奥思技术大咖深度分享
  15. SoapUI 使用变量
  16. SFML从入门到放弃(3) 视角和碰撞检测
  17. 谷歌GSON的字符与对象的互转
  18. python2 - 列表
  19. Hibernate Annotation (Hibernate 注解)
  20. python tips;matplotlib 显示中文

热门文章

  1. fenby C语言 P14
  2. Node配合WebSocket做多文件下载以及进度回传
  3. 前端技术之:常见前端Web框架
  4. 使用 HTML5 WebSocket 构建实时 Web 应用
  5. [Java]Java类和对象内存分配详解
  6. 星空:差分,状压dp
  7. P5304旅行者(比bk201还要流氓的解法)
  8. css3-3D特效
  9. Hibernate的多对多关系
  10. ES6学习笔记01 -- 暂时性死区 ( temporal dead zone )