寻找最远点对

本来想出道题,一开始想到求无向图中所有任意两个点最短距离中的最长距离,但是网上查了一下是NP难问题,果断弃坑。

我的想法:

每个点dijkstra+堆优化/斐波那契堆

对入度、出度为1的点进行缩点

 

然后我想到求所有点中任意两个点距离中的最长距离,就是最远点对,我想到的是O(nlogn)凸包 + O(n*n)凸包中的点两两配对【各种优化证明不对】,结果我在网上查了一下,有O(n)算法,果然我还是too young too simple……

 

1).凸包围起来所有的点,最长距离对为凸包中的两个点连起来的线段

证明:

1. 对于任意两个点连成的线段a,左右延长,直到与凸包中的线段相交,才停止,得到线段b。len(b)>=len(a)

2. 找到线段中其中一个点的左右端点,与线段中的另外一个点连接,得到三角形

 

3. 线段b的长度小于等于三角形左右两条边的其中一条的长度

 首先以线段b在三角上的那个端点为圆心,以三角形左右两条边中最长的边为半径画圆

b<=y<=z

 

4. 与3一样的方法

 

 

 2) 旋转卡壳

https://blog.youkuaiyun.com/huyuncong/article/details/6438284

https://blog.youkuaiyun.com/Hackbuteer1/article/details/7484746

转载于:https://www.cnblogs.com/cmyg/p/8800579.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值