flod弗洛伊德算法详解


弗洛伊德算法简介:

顶点对之间的最短路径是指:对于给定的有向网G=(V,E),要对G中任意一对顶点有序对VW(V≠W),找出VW的最短距离和WV的最短距离。

解决此问题的一个有效方法是:轮流以每一个顶点为源点,重复执行迪杰斯特拉算法n,即可求得每一对顶点之间的最短路径,总的时间复杂度为O(n3)

弗洛伊德(Floyd)提出了另外一个求图中任意两顶点之间最短路径的算法,虽然其时间复杂度也是 O(n3),但其算法的形式更简单,易于理解和编程。

算法基本思想

弗洛伊德算法仍然使用图的邻接矩阵arcs[n+1][n+1]来存储带权有向图。算法的基本思想是:设置一个n x n的矩阵A(k),其中除对角线的元素都等于0外,其它元素a(k)[i][j]表示顶点i到顶点j的路径长度,K表示运算步骤。开始时,以任意两个顶点之间的有向边的权值作为路径长度,没有有向边时,路径长度为,当K=0, A (0)[i][j]=arcs[i][j],以后逐步尝试在原路径中加入其它顶点作为中间顶点,如果增加中间顶点后,得到的路径比原来的路径长度减少了,则以此新路径代替原路径,修改矩阵元素。具体做法为:  

第一步,让所有边上加入中间顶点1,取A[i][j]A[i][1]+A[1][j]中较小的值作A[i][j]的值,完成后得到A(1)

第二步,让所有边上加入中间顶点2,取A[i][j]A[i][2]+A[2][j]中较小的值,完成后得到A(2)…,如此进行下去,当第n步完成后,得到A(n)A(n)即为我们所求结果,A(n)[i][j]表示顶点i到顶点j的最短距离。    

  
  怎样构造一个图,再次不赘述,直接给出floyd算法。
  void MDNet::Floyd(CDC *pDC)
  {
  	typedef vector path;//使用顺序表模板
  	path p[max_vertex_num][max_vertex_num];
  	//p存放每对顶点之间的最短路径
  
  	int D[max_vertex_num][max_vertex_num];
  	// D存放每对顶点之间的最短路径值
  	int i,j,k;
  	for(i=1;i<=vex_num;i++)
  	{//初始化
  		for(j=1;j<=vex_num;j++)
  		{
  			p[i][j].push_back(i);
  			p[i][j].push_back(j);
  			//顶点i和顶点j之间的路径初始时就是ij。
  			D[i][j]=arcs[i][j];//路径值为边(i,j)的权值
  		}
  	} 
  for(k=1;k<=vex_num;k++)
  	 {//对于每一个顶点都要试探
  		for(i=1;i<=vex_num;i++)
  		{
  			for(j=1;j<=vex_num;j++)
  			{//在顶点i和顶点j之间的路径上试探k
  				if(i==j)continue;//对角线上的元素(即顶点自身之间)不予考虑
  					if(D[i][k]+D[k][j]













你可能感兴趣的:(算法,编程语言,c/c++,flod,弗洛伊德,算法,ospf,迪杰斯特拉)