Floyd算法
来源:互联网 发布:适合度蜜月的地方知乎 编辑:程序博客网 时间:2024/05/08 11:28
三次循环解决任意两点间的最短路径的算法,可以处理有向图或负权值的最短路径问题,同时也被用于计算有向图的传递闭包
设为从到的只以集合中的节点为中间節点的最短路径的长度。
- 若最短路径经过点k,则;
- 若最短路径不经过点k,则。
因此,
初始化Dis[i][i]=0;Dis[i][j]=INF; 将图中的边存入Dis[i][j]for ( int k= 1; k<= n; k++ ) // n为节点个数
{
for ( int i= 1; i <=n; i++ )
{
for ( int j = 1; j <=n; j++ )
{
if ( Dis[i][k] + Dis[k][j] < Dis[i][j] ) // 找到更短路径
Dis[i][j] = Dis[i][k] + Dis[k][j];
}
}
}
真正的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]+c [k, j, k-1]},k>0。
这样,问题便具有了最优子结构性质,可以用动态规划方法来求解。
- void floyd_dp(){
- 18 int i,j,k;
- 19 for(i=1;i<=n;i++)
- 20 for(j=1;j<=n;j++)
- 21 dist[i][j][0]=map[i][j];
- 22 for(k=1;k<=n;k++)
- 23 for(i=1;i<=n;i++)
- 24 for(j=1;j<=n;j++){
- 25 dist[i][j][k]=dist[i][j][k-1];
- 26 if(dist[i][k][k-1]+dist[k][j][k-1]<dist[i][j][k])
- 27 dist[i][j][k]=dist[i][k][k-1]+dist[k][j][k-1];
- 28 }
- 29 }
0 0
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- floyd 算法
- Floyd算法
- floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- 大端与小端的读书笔记
- LDFLAGS, LIBS, CSFLAGS
- MyEclipse 10 下在线安装插件
- Java 并发核心编程
- SQLSERVER 查询数据库表索引
- Floyd算法
- 算法:删除链表倒数第n个数
- c++指南大杂烩
- 文件的分割与合并
- Java 多线程与并发编程专题
- 手机网页示例1——通过CSS的宽度百分比设置达到页面自适应效果
- Traffic Server 正向代理(透明代理)
- MySQL数据库迁移(数据文件直接迁移)
- 2014微软编程之美初赛第一场 焦距