现在的位置: 首页 > 综合 > 正文

【算法设计与分析】全源最短路径的Floyd算法

2018年04月29日 ⁄ 综合 ⁄ 共 1288字 ⁄ 字号 评论关闭

首先给出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.

抱歉!评论已关闭.