利用弗洛伊德算法求某一顶点到其余各顶点的最短路径

      虽然能用迪杰斯特拉算法求出图中某一个顶点到其余各个顶点的最短路径,但是如果求图中任意一对顶点间的最短路径,通常用弗洛伊德算法求解。

【弗洛伊德算法求解最短路径的一般过程】、

      第一步,这是两个矩阵A和Path,初始时将图的邻接矩阵赋值给A,将矩阵Path中元素全部设置为-1。

      第二步,以顶点k为中间顶点,k取0-n-1(n为图中顶点个数),对图中所有顶点对{i,j}进行如下检测与修改:

如果A[i][j] > A[i][k] + A[k][j],则将A[i][j]修改为A[i][k] + A[k][j]的值,将Path[i][j]的值改为k,否则什么都不做。

【弗洛伊德算法伪代码——参考自《数据结构高分笔记》】

public void Floyd(MGraph g,int A[][maxsize],int Path[][maxsize]){
	for(int i=0;i<g.n;++i){		//这个双重循环实现对数组A和Path初始化赋值
		for(int j=0;j<g.n;++j){
			A[i][j] = g.edges[i][j];
			Path[i][j] = -1;
		}
	}

	for(int k=0;k<g.n;++k){		//这个三重循环完成了以k为中间点对所有的定点对<i,j>进行检测和修改
		for(int i=0;i<g.n;++i){
			for(int j=0;j<g.n;++j){		//循环以行优先遍历矩阵
				if(A[i][j] > A[i][k]+A[k][j]){
					A[i][j] = A[i][k]+A[k][j];
					Path[i][j] = k;
				}
			}
		}
	}
}

【弗洛伊德算法Path矩阵分析】

      当执行完弗洛伊德算法后,Path矩阵可以算出任意两个顶点间的最短路径上的顶点序列,而这个过程是一个递归的过程,伪代码如下(参考自《数据结构高分笔记》)。

public void printPath(int u,int v,int Path[][maxsize]){		//该函数可以输出从顶点u到顶点v的最短路径上的顶点序列
	if(Path[u][v] == -1)
		System.out.println("顶点u和顶点v之间无最短路径序列");
	else{
		int mid = Path[u][v];
		printPath(u,mid,Path);	//处理mid前半段路径
		printPath(mid,v,Path);	//处理mid后半段路径
	}
}

【弗洛伊德算法的时间复杂度】

     弗洛伊德算法的核心部分为一个三重循环,基本操作执行次数为n^3,因此弗洛伊德算法的时间复杂度为O(n^3)。

猜你喜欢

转载自blog.csdn.net/weixin_36378917/article/details/80586934
今日推荐