Floyd-Warshall算法

简单路径p={v1,v2,...,vl}上的中间顶点是除v1和vl以外p上得任何一个顶点。

令dij(k)为从顶点i到顶点j、且满足所有中间顶点皆属于{1,2,...,k}的一条最短路径的权值。当k=0时,从i到j根本不存在中间顶点。

递归式为

dij(k)=wij if k=0    or         min(dij(k-1) , dik(k-1) + dkj(k-1))   if k>=1

 

 

 

floyd
 1 int D[5][25];
2
3 void Floyd_Warshall(const Graph* g)
4 {
5 for(int i=0;i<25;++i)
6 D[0][i]=g->W[i];
7
8 for(int k=1;k<=5;++k)
9 {
10 for(int i=1;i<=5;++i)
11 {
12 for(int j=1;j<=5;++j)
13 {
14 int a=D[k-1][5*(i-1)+j-1];
15 int b=D[k-1][5*(i-1)+k-1]+D[k-1][5*(k-1)+j-1];
16 if(a<b)
17 D[k][5*(i-1)+j-1]=a;
18 else
19 D[k][5*(i-1)+j-1]=b;
20 }
21 }
22 }
23 for(int i=0;i<25;++i)
24 {
25 int u=i/5+1;
26 int v=i%5+1;
27 cout <<"The shortest distance from "<<u<<" to "<<v<<" is "<<D[5][i]<<endl;
28 }
29 }

 

 

posted @ 2012-03-13 21:05  Cavia  阅读(377)  评论(0编辑  收藏  举报