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