Floyd算法(各对顶点之间的最短距离)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Floyd算法(各对顶点之间的最短距离)
Floyd算法(各对顶点之间的最短距离)在上篇文章中议论到了如何求算单源最短路径,因此要想求各对顶点之间的距离,只需循环求算n次即可。

还有另外一种办法来求算各对顶点之间的最短距离,就是Floyd算法,因为其算法过程比Dijksa更简单理解,并且代码更简洁,因此当求算各对顶点之间的最短距离常采纳Floyd算法。

一.Floyd算法假设从i到j的最短路径上要经过若干个顶点,这些中间顶点中最大的顶点编号为k,最小的顶点为t,因此要求算dist[i][j]的最小值,那么只需要求算dist[i][s]+dist[s][j](t =s =k)的全部值,并取其中最小者即可。

因此可以设置一个中间顶点k(0 =k n)分离插入到每队顶点(i,j)之中,并更新dist[i][j]的值。

当n个顶点插入到每队顶点之中,求解便结束了。

其实Floyd算法实质上是一个动态规划算法。

代码实现: /*每对顶点之间最短路径Floyd 2011.8.27*/ ilude
iostream include stack define M 100define N 100using namespace std;typef struct node{ int matrix[N][M]; //邻接矩阵 int n; //顶点数 int e; //边数 }MGraph; vo FloydPath(MGraph g,int
dist[N][M],int path[N][M]){ int i,j,k; for(i=0;i g.n;i++)
for(j=0;j g.n;j++) { if(g.matrix[i][j] 0)
{ dist[i][j]=g.matrix[i][j]; path[i][j]=i; } ee { if(i!=j) { dist[i][j]=INT_MAX; path[i][j]=-1; } else { dist[i][j]=0; path[i][j]=i; } } } for(k=0;k g.n;k++) //中间插入点(注重理
解k为什么只能在最外层) for(i=0;i g.n;i++) for(j=0;j
g.n;j++) { if((dist[i][k] 0 dist[i][k] INT_MAX) //防止加法溢
出 (dist[k][j] 0 dist[k][j] INT_MAX) dist[i][k]+dist[k][j] dist[i][j]) { dist[i][j]=dist[i][k]+dist[k][j];
path[i][j]=path[k][j]; //path[i][j]记录从i到j的最短路径上j 的前一个顶点 } } }void showPath(int path[N][M],int s,int t) //打印出最短路径 { stack int st; int v=t; while(t!=s) { st.push(t);
第1页共2页。

相关文档
最新文档