Floyd-Warshall算法DP(动态规划(dynamic programming))流程详解

本文详细介绍了Floyd-Warshall算法,用于求解图中任意两点间的最短路径,时间复杂度为O(n^3)。通过动态规划思想,解释了算法的最优子结构,并给出了状态转移方程。此外,还展示了算法在具体有向图中的应用,不仅计算最短路径长度,还能获取路径上的节点。
摘要由CSDN通过智能技术生成

今天浏览了2009软考试题,其中有一个设计题关于Floyd-Warshall算法的问题,本身对该算法不熟悉,了解下

转自:http://www.cppblog.com/mythit/archive/2009/04/21/80579.html

 

Floyd-Warshall算法,简称Floyd算法,用于求解任意两点间的最短距离,时间复杂度为O(n^3)。我们平时所见的Floyd算法的一般形式如下:

1  void  Floyd(){
2       int  i,j,k;
3       for (k = 1 ;k <= n;k ++ )
4           for (i = 1 ;i <= n;i ++ )
5               for (j = 1 ;j <= n;j ++ )
6                   if (dist[i][k] + dist[k][j] < dist[i][j])
7                      dist[i][j] = dist[i][k] + dist[k][j];
8  }

  注意下第6行这个地方,如果dist[i][k]或者dist[k][j]不存在,程序中用一个很大的数代替。最好写成if(dist[i][k]!=INF && dist[k][j]!=INF && dist[i][k]+dist[k][j]<dist[i][j]),从而防止溢出所造成的错误。
  上面这个形式的算法其实是Floyd算法的精简版,而真正的Floyd算法是一种基于DP(Dynamic Programming)的最短路径算法。
  设图G中n 个顶点的编号为1到n。令c [i, j, k]表示从i 到j 的最短路径的长度,其中k 表示该路径中的最大顶点,也就是说c[i,j,k]这条最短路径所通过的中间顶点最大不超过k。因此,如果G中包含边<i, j>,则c[i, j, 0] =边<i, j> 的长度;若i= j ,则c[i,j,0]=0;如果G中不包含边<i, j>,则c (i, j, 0)= +∞。c[i, j, n] 则是从i 到j 的最短路径的长度。
  对于任意的k>0,通过分析可以得到:中间顶点不超过k 的i 到j 的最短路径有两种可能:该路径含或不含中间顶点k。若不含,则该路径长度应为c[i, j, k-1],否则长度为 c[i, k, k-1] +c [k, j, k-1]。c[i, j, k]可取两者中的最小值。
  状态转移方程:c[i, j, k]=min{c[i, j, k-1], c [i, k, k

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值