图最短路径的迪杰斯特拉算法
其本质是贪心算法,即每一次确定下一步走哪条路都是最为贪心的选择,也就是按权值最小作为标准。前提是该路之前没被走过(当然走过的路再走一遍也没意义)
这是一个例子,我在第四步里写了两种情况,这是在权值未知的情况下的两种情况。 这里需要补充的是,这种算法实际上也是一种遍历,与遍历略微不同的是,它将会对旧的结果进行覆盖,那说明之前旧的结果不是两点之间的最短路径,目前这个是已经遍历到的最短的路径
本质就是一次次的循环,当欲访问节点出现(v5),就不再往前探索,而是将已经存在数组里但未到达v5的路径组继续探索,直到路径组到达v5,然后将其路径与之前到达v5的路径比较,选择较小的存起来,当所有的到达v5的路都探索完了,剩下的那个就是最短的v0到v5的路径 这个算法为什么这么设计呢? 个人猜测,这个和迷宫游戏性质类似,只不过给迷宫的每条路加上权值而已,但路的权值只有走过这条路才知道,走之前是不知道的,试想一下,我想花最小代价到达终点,我可以每次都假设终点就在我将要选择的路的对面,而我的目的是代价最小,那我就走到我目前所知道的最短路径的点,然后再从这个点出发找终点,因为如果终点在对面那我就走对了,如果不是终点再另说,然后把这条路记在本本上,如果对面确实是终点,那么我先记下来,记下来我确实到终点了,但不一定是最小的,因为每条路走之前我是不知道权值的,所以可能最后到终点的这条路权值非常大,但只有走过我才知道,所以我需要回去再把那些没走过的路走一遍走到终点,最后找最小的;但如果没到终点,那我得看看我下一步应该走哪条路,那么此时最好的选择也应该是选择目前存在最短路径的节点的路,因为我不知道终点在哪,我只能说保证我之前走的路是最短的,然后一次次尝试新的路,最后找到终点,再把没走过的路再走一遍
就像这个较为极端的例子,第一步直接01237到终点,过程中记录了5和4的存在,所以到7后我再返回来看看从3到4这条路能不能通,能通就比较权值然后取小的放起来,然后再看看还有5没访问,那就去看看1到5这条路怎么样,通,就比较权值取小的放起来,最后发现路都走完了,那就结束了,最后省的权值就是最小的