关于Dijkstra算法的个人理解

本来说是今年还是要好好的搞一年算法的,但是工程花费的时间和精力比想象的要多得多啊。所以最近的算法什么的也是好久没动了。

不过今天下午真的好像大概是没什么事情了,想了想,就去看了Dijkstra算法。

说实话,我之前看到图论的题心里都是打鼓的。不过……

这次这尼玛是坑爹呢吧!

Dijkstra的个人理解

嗯,最开始看算法的内容的时候真是一个字一个字看的。

可是看到后来就觉得不对劲了。告诉我!这和Prim差什么么?

 

1.Dijkstra是求单元最短路径的算法,思想上我们可以很好的借鉴最小生成树的Prim算法,不过我们需要多做的事情就是分别记录每个点被添加到树中时,这个点到根节点(也就是我们求最短路径时的那个起点)所需的权值(语死早,凑合看)?

2.同样,我们需要一个数组来记录该节点是否已经加入我们的这个树中。我们在这里声明一个bool型的数组visit[]来标记各个点。用邻接矩阵来表示所相连的节点的路径的权值。姑且就用一个int或者double型的数组map[][]来吧。而且我们这次需要记录所有节点到根节点的权值,那也就需要一个int或者double型的数组来记录,我们姑且叫他dist[]

3.准备工作完成了(撒花!)。那么开始正式的部分。和prim一样,我们判断所有节点与根节点的关系,假设根节点为root,与其相关的节点为i。如果rooti相连,那么就会有dist[i] = map[root][i]。如果i不与root相连,那么dist[i] = MaxInt;这样!(Psrootrootdist0,且visit[root] =true表示已经访问过了)

4.OK,接下来我们遍历dist数组,在所有未被访问的节点中,找出其中记录的权值的最小的与root相连的点i(我很懒)。然后将i点记录为已经访问。

5.这样如同Prim算法一样,我们有一个新的成员加入了,那么我们开始根据这个节点开辟新的下线。遍历所以的未访问过的且与i相连的节点j,如果dist[i] + map[i][j] < dist[j]j点通过i节点到达root的权值小于j节点之前通过某种路径到达root的权值)那么我们就将dist[j]的值更新为dist[i] + map[i][j]然后回到4步骤,如此循环若干遍直到所有的节点全部加入。

6.好了,任务完成。这样我们就得到了一个赋过值的dist[],而其中的dist[i]所存储的值就是i节点到root节点所需的最短路径!

 

 

(最后说点多余的,很好想到的就是越是后来加入的节点到root的路径就越长。嘛嘛,当废话看吧。毕竟感觉正常点的做到变形题就都会想到了。)

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