引用自【Algorithms】最短路径算法CH:Contraction hierarchies
预处理生成一个多层的结构,每个点都处在单独的一层。事先对点进行优先级排序(怎么排都行,但是排序的好坏直接影响到预处理的效率以及搜索的效率。举个例子,邻接点个数)
点的优先级(高低)是人为指定的,根据优先级从低到高依次选点进行contraction.什么是contraction呢,假设拿掉这个点,看看会不会影响图中点对之间的shorstest path。因此只需要看看它邻接的级别比它高的点的两两点对之间的shortest path是否经过这个点,如果经过的话,就在这个点对之间加上一条边存储它们的shortest path,这条边叫做shortcut。为什么只需要看级别比它高的点?这与CH在搜索最短路径时的算法有关。CH采用双向Dijkstra,并且搜的时候只能从级别低的往级别高的搜,两边相碰之后,就保存路径。如果某个点A的两个邻接点B,C的级别都比A低,而且BC之间的最短路径经过A的话,是不需要在BC之间加shorcut的,直接通过双向Dijkstra可以搜索出来。
搜索过程:
双向dijkstra,从低往高搜。停止条件:两边的open队列都为空了
搜完之后,需要将shortcut转化成原始边。
传统的 Dijkstra最短路径问题的询问时间,取决于搜索的问题的距离 Query time independent of dist(s, t)
因为Dijkstra 算法属于启发式算法 以一个点为中心,向外层层扩展。 所以,在计算给定两点,或者是源点的问题是,这个算法并不快。现在做的东西需要一个快速计算,一个给定点到所有点的最短路径。