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

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

http://blog.csdn.net/theprinceofelf/article/details/7209872

首先给出Floyd算法的实现代码

 

  1. constint vexnum = 5; 
  2. constint maxval = 65536;/*图中表示不可达的长度*/ 
  3. void Floyd(int G[][vexnum],int dist[][vexnum],int path[][vexnum]) 
  4.  
  5.     for(int i=0; i<vexnum; ++i) 
  6.         for(int j=0; j<vexnum; ++j) 
  7.         { 
  8.             /*initiate the dist[][] and path[][]*/ 
  9.             dist[i][j] = G[i][j]; 
  10.             if(i!=j && dist[i][j]<maxval) 
  11.             {   path[i][j] = i;} 
  12.             else 
  13.             {   path[i][j] = 0;} 
  14.         } 
  15.      
  16.  
  17.     for(int k=0; k<vexnum; ++k) 
  18.         for(int i=0; i<vexnum; ++i) 
  19.             for(int j=0; j<vexnum; ++j) 
  20.                 if( dist[i][j] > dist[i][k]+dist[k][j] ) 
  21.                 { 
  22.                     dist[i][j] = dist[i][k] + dist[k][j]; 
  23.                     path[i][j] = path[k][j]; 
  24.                 } 
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];
				}
}

 

 

下面做一个简单测试(有向图如下):

 

 

相应的邻接矩阵为:

 

  1.   0,       50,     10,   maxval,    45, 
  2. maxval,     0,     15,   maxval,    10,  
  3. maxval,   maxval,   0,     15,    maxval, 
  4. maxval,    20,    maxval,   0,      35, 
  5. maxval,   maxval, maxval,  30,       0 
  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

 

 

全部测试代码如下:

 

 

  1. /*数组显示函数*/ 
  2. void Display(int arr[vexnum][vexnum]) 
  3.     for(int i=0;i<vexnum;++i) 
  4.     { 
  5.         for(int j=0;j<vexnum;++j) 
  6.             cout<<arr[i][j]<<'\t'
  7.         cout<<endl; 
  8.     } 
  9.  
  10. int main() 
  11.     /*准备数据 和 辅助记录数组*/ 
  12.     int G[vexnum][vexnum] ={     
  13.                                    0,       50,     10,   maxval,    45, 
  14.                                  maxval,     0,     15,   maxval,    10,  
  15.                                  maxval,   maxval,   0,     15,    maxval, 
  16.                                  maxval,    20,    maxval,   0,      35, 
  17.                                  maxval,   maxval, maxval,  30,       0 
  18.                             }; 
  19.     int dist[vexnum][vexnum]; /*记录最短距离*/ 
  20.     int path[vexnum][vexnum]; /*记录最短路径*/ 
  21.  
  22.     /*执行算法*/ 
  23.     Floyd(G,dist,path); 
  24.  
  25.     /*显示邻接矩阵*/ 
  26.     cout<<"graph:"<<endl; 
  27.     Display(G); 
  28.  
  29.     /*显示最短距离*/ 
  30.     cout<<"dist:"<<endl; 
  31.     Display(dist); 
  32.      
  33.     /*显示最短路径*/ 
  34.     cout<<"path:"<<endl; 
  35.     Display(path); 
  36.      
  37.     system("pause"); 
  38.  
  39.     return 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.

 

posted @ 2012-11-30 16:04  flylong0204  阅读(313)  评论(0)    收藏  举报