dijkstra小结+(虚拟起点、终点简单介绍)

对于dijkstra一类的题要注意以下几点:

        1.要注意题目中要求的是不是有向图(这点经常容易被忽略)。有的要求无向图(如:HDUOJ_1869(六度分离)当初没考虑是无向图,结果一直错),而有的题要求是 有向图(如:HDUOJ_(Choose the best route )2680由于当时当作无向图处理,也是一直出错)。

       2.有的题要考虑重边问题(这点经常容易遗忘),在输入数据时可能两个点之间的相关数据有多组,根据题意 取最大者或最小者。(如:HDUOJ_1874(畅通工程续))。

      3.要根据不同的题,适度改动模板,不能死记模板,要在理解的基础上记忆。通常做的题都是求最短路径或最小值,但是有的题却是求最大值(如:HDUOJ_1596(find the safest road)),与之前的求最小值(最短路径)恰恰相反。

     4.一般我们都是根据起点找终点,如:给出一个起点和一个终点,有时特殊时会给出一个起点,多个终点。此时需巧用for循环,调用dijkstra函数一次,

然后通过for循环查找不同终点的最短路径(如:HDUOJ_(Choose the best route )2680)。有时也会遇到多个起点,多个终点。此时会有两种情况,一种是n个起点,m个终点,每个起点都对应m个终点。此时需巧用双重for循环,第一层for控制起点的变换(多次调用dijkstra函数),第二层for循环控制终点的变换。这样比 每一组起点和终点都调用dijkstra函数省很多时间。(如:HDUOJ_1869(六度分离))。一种是多个起点和多个终点,但二者之间的组合都是随机的没有规律,这种只能每组起点和终点都调用一次,但是比较费时(如果可以的话,也可以采用别的方法解)(如:HDUOJ_2066(一个人的旅行))。

      5.有时我们也需转换一下思路,上面讲的都是通过起点找终点,但是有的题有时通过起点找终点比较麻烦,但是通过终点找起点却比较容易。如:当有多个起点,一个终点时,找出最短路径。此时从起点往终点找比较麻烦,甚至可能会超时。但是当把终点当作起点,原来的起点当作终点后,问题就转化为,一个起点,多个终点的问题,只需调用dijkstra函数一次,便可解决。(如:HDUOJ_(Choose the best route )2680)。

6.当有多个起点和多个终点求最短路径时,可以尝试用虚拟1个终点虚拟1个起点,从而使问题转化为最简单的求一个起点到一个终点的最短路径问题。(参照2066一个人的旅行(floyd+虚拟起点和虚拟终点

  虚拟起点和虚拟终点示意图:

《dijkstra小结+(虚拟起点、终点简单介绍)》

《dijkstra小结+(虚拟起点、终点简单介绍)》


       这只是本人在做了这几道题后总结出来的,可能会有些不足。

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/hpulw/article/details/47767381
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞