【NOIP2017提高A组模拟10.8】Star Way To Heaven(欧几里得距离最小生成树Prim做法)

本文介绍了如何使用Prim算法解决NOIP2017提高组模拟赛中的Star Way To Heaven问题。通过二分答案和构建半径为r的圆,判断是否存在合法路径。文章详细阐述了Prim算法的流程,并指出在处理此类问题时,由于边数过多,直接扫描求解的效率更高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description:

这里写图片描述
k<=6000,n,m<=10^6

题解:

直接想找到这样一条路径是很难的。

可以考虑二分答案r,对k个star都建一个半径为r的圆,那么对于两个相交的圆把它们弄到一个集合,对上下边界特殊判断,如果说上下边界被弄到了一个集合,即说明,有若干个圆将矩形拦腰折断,分成了两个不连通的部分,则这个答案不合法。

其实也可以对n个点进行欧几里得距离最小生成树,当然,边界特盼,什么时候上下边界都在生成树里了,则当前生成树的最长边的一半就是答案。

这样的图有n个点,n^2条边,可以直接用prim算法进行生成。

prim算法流程:

有两个点集V,V’,V’一开始为空,V为我要最小生成树的点集。

首先随便从V里移一个点到V’,这题肯定是放一个边界点。

找到一条边,它的两个点分别在V’,V里,并且它的长度最短,把在V里的端点移到V’去,继续这样直到结束。

可以记dis[i]为V’中的点到i的最短距离,每次移了一个点去V’,把这个点相邻的点的dis全部维护一遍,然后找最小的dis就行了。

如果找dis用普通堆维护的话,复杂度就是O(E log |V|),据说斐波拉契堆可以达到O(E +|V| log |V|),这个不会。

但是这题显然不用什么堆,因为已经有N^2条边了, 用堆干什么?直接扫一遍求最小值就是O(N^2)的了。

czy大佬当时说,他考场打了4000bytes+的O(n log n)欧几里得距离

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值