最短路径算法CH

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转化成原始边。 

你可能感兴趣的:(图论算法)