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{D−1[v][w],D−1[v][0]+D−1[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的顶点 */
}
}
}
}
}