首先给出Floyd算法的实现代码
const int vexnum = 5;
const int maxval = 65536;/*图中表示不可达的长度*/
void Floyd(int G[][vexnum],int dist[][vexnum],int path[][vexnum])
{
for(int i=0; i<vexnum; ++i)
for(int j=0; j<vexnum; ++j)
{
/*initiate the dist[][] and path[][]*/
dist[i][j] = G[i][j];
if(i!=j && dist[i][j]<maxval)
{ path[i][j] = i;}
else
{ path[i][j] = 0;}
}
for(int k=0; k<vexnum; ++k)
for(int i=0; i<vexnum; ++i)
for(int j=0; j<vexnum; ++j)
if( dist[i][j] > dist[i][k]+dist[k][j] )
{
dist[i][j] = dist[i][k] + dist[k][j];
path[i][j] = path[k][j];
}
}
下面做一个简单测试(有向图如下):
相应的邻接矩阵为:
0, 50, 10, maxval, 45,
maxval, 0, 15, maxval, 10,
maxval, maxval, 0, 15, maxval,
maxval, 20, maxval, 0, 35,
maxval, maxval, maxval, 30, 0
全部测试代码如下:
/*数组显示函数*/
void Display(int arr[vexnum][vexnum])
{
for(int i=0;i<vexnum;++i)
{
for(int j=0;j<vexnum;++j)
cout<<arr[i][j]<<'\t';
cout<<endl;
}
}
int main()
{
/*准备数据 和 辅助记录数组*/
int G[vexnum][vexnum] ={
0, 50, 10, maxval, 45,
maxval, 0, 15, maxval, 10,
maxval, maxval, 0, 15, maxval,
maxval, 20, maxval, 0, 35,
maxval, maxval, maxval, 30, 0
};
int dist[vexnum][vexnum]; /*记录最短距离*/
int path[vexnum][vexnum]; /*记录最短路径*/
/*执行算法*/
Floyd(G,dist,path);
/*显示邻接矩阵*/
cout<<"graph:"<<endl;
Display(G);
/*显示最短距离*/
cout<<"dist:"<<endl;
Display(dist);
/*显示最短路径*/
cout<<"path:"<<endl;
Display(path);
system("pause");
return 0;
}
测试结果为:
dist 中 65536表示无法到达
path 中对角线上的0表示自身,非对象线的元素表示,要到达这个节点需要到达的上一个结点,如 v0->v3,path值为2,需要先到达v2, v0->v2 path值为0,即从v0开始即可,所以v0到v3的最短路径是v0->v2->v3.