【算法】01 弗洛伊德(Floyd)算法

文章目录

1 基本原理

Floyd算法是为求解有环图所有顶点所有顶点最短路径的算法,算法复杂度为O(n3)。

主要思想是让每个顶点作为中转,比较与原有路径大小关系,更新矩阵。

D 0 [ v ] [ w ] = m i n { D − 1 [ v ] [ w ] , D − 1 [ v ] [ 0 ] + D − 1 [ 0 ] [ w ] } D^0[v][w]=min\{D^{-1}[v][w],D^{-1}[v][0]+D^{-1}[0][w]\} D0[v][w]=min{ D1[v][w],D1[v][0]+D1[0][w]}

2 代码

typedef int Patharc[MAXVEX][MAXVEX];
typedef int ShortPathTable[MAXVEX][MAXVEX];
void ShortestPath_Floyd(MGraph G, Patharc *P, ShortPathTable *D)
{
    
        
	int v,w,k;    
	for(v=0; v<G.numVertexes; ++v) /* 初始化D与P */  
	{
    
            
		for(w=0; w<G.numVertexes; ++w)  
		{
    
    
			(*D)[v][w]=G.arc[v][w];	/* D[v][w]值即为对应点间的权值 */
			(*P)[v][w]=w;				/* 初始化P */
		}
	}
	for(k=0; k<G.numVertexes; ++k)   
	{
    
    
		for(v=0; v<G.numVertexes; ++v)  
		{
    
            
			for(w=0; w<G.numVertexes; ++w)    
			{
    
    
				if ((*D)[v][w]>(*D)[v][k]+(*D)[k][w])
				{
    
    /* 如果经过下标为k顶点路径比原两点间路径更短 */
					(*D)[v][w]=(*D)[v][k]+(*D)[k][w];/* 将当前两点间权值设为更小的一个 */
					(*P)[v][w]=(*P)[v][k];/* 路径设置为经过下标为k的顶点 */
				}
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43012724/article/details/107183501
今日推荐