2023-11-09 bigbai
1、-算法,-,是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。-算法的时间复杂度为(^3),空间复杂度为(^2)。
2、算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点到点的最短路径。从动态规划的角度看问题,我们需要为这个目标重新做一个诠释,这个诠释正是动态规划最富创造力的精华所在,从任意节点到任意节点的最短路径不外乎2种可能,1是直接从到,2是从经过若干个节点到。
3、所以,我们假设(,)为节点到节点的最短路径的距离,对于每一个节点,我们检查(,)+(,)< Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。a. 从任意一条单边路径开始。
4、所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大b. 对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它。方法:两条线,从左上角开始计算一直到右下角 如下所示。给出矩阵,其中矩阵A是邻接矩阵,而矩阵Path记录u,v两点之间最短路径所必须经过的点。
5、相应计算方法如下:。核心代码只有 4 行,实在令人赞叹。核心代码只有四行,三行循环,一行更新,的确十分简洁优雅,可是这四行代码为什么就能求出任意两点的最短路径呢。
1、看代码的特点,很显然特别像是一种动态规划,确实,之前也说过该算法是基于动态规划的。我们从动态规划的角度考虑,解动态规划题目的重点就是合理的定义状态,划分阶段,我们定义 f[k][i][j] 为经过前k的节点,从i到j所能得到的最短路径,f[k][i][j]可以从f[k-1][i][j]转移过来,即不经过第k个节点,也可以从f[k-1][i][k]+f[k-1][k][j]转移过来,即经过第k个节点。观察一下这个状态的定义,满足不满足最优子结构和无后效性原则。
2、图结构中一个显而易见的定理:。最短路径的子路径仍然是最短路径, 这个定理显而易见,比如一条从a到e的最短路a->->->->那么->->一定是到的最短路->->一定是到的最短路,反过来,如果说一条最短路必须要经过点,那么->的最短路加上->的最短路一定是->经过的最短路,因此,最优子结构可以保证。
3、状态[][][]由[-1][][],[-1][,]以及[-1][][]转移过来,很容易可以看出,[]的状态完全由[-1]转移过来,只要我们把放倒最外层循环中,就能保证无后效性。满足以上两个要求,我们即证明了算法是正确的。我们最后得出一个状态转移方程:,可以观察到,这个三维的状态转移方程可以使用滚动数组进行优化。采用动态规划思想,表示和之间可以通过编号为1…的节点的最短路径。
4、初值为原图的邻接矩阵。则可以从转移来,表示到不经过这个节点。也可以从转移过来,表示经过这个点。然后你就会发现最外层一维空间可以省略,因为[]只与[-1]有关。
5、虽然这个算法非常简单,但也需要找点时间理解这个算法,就不会再有这种问题啦。算法的本质是,而是的阶段,因此要写最外面。
原文链接:https://www.bigbai.cc/news/7505.html
本文版权:如无特别标注,本站文章均为原创。