寻找最远点对

本来想出道题,一开始想到求无向图中所有任意两个点最短距离中的最长距离,但是网上查了一下是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.csdn.net/huyuncong/article/details/6438284

https://blog.csdn.net/Hackbuteer1/article/details/7484746

原文地址:https://www.cnblogs.com/cmyg/p/8800579.html