Floyd算法也是著名的最短路径求解算法,其过程非常简洁优雅,基本原理和Dijkstra算法相似。如果比较两个算法的时间复杂度,那么Dijkstra算法的效率要更高,因为Floyd算法的时间复杂度为O(n^3),而Dijkstra算法只需要O(n^2)的时间复杂度。但是Floyd算法的优势在于,它能一次求得任何两个节点之间的最短路径,而Dijkstra算法只能求得以特定节点开始的最短路径。
下面直接给出Floyd的算法的实现代码,理一理该算法的具体步骤,谈谈我自己的理解:
#define MAXVEX 15
#define INFINITY 65535
typedef int Pathmatrix[MAXVEX][MAXVEX]; //用于保存两节点间最短路径中某个节点的下标
typedef int ShortPathTable[MAXVEX][MAXVEX]; //用于保存两个节点之间的最短路径
void ShortestPath_Floyd(MGraph G, Pathmatrix *P, ShortPathTable *D)
{
int v, w, k;
//初始化
for(v = 0; v < G.numVertexes; v++)
{
for(w=0; w < G.numVertexes; w++)
{
(*D)[v][w] = G.matrix[v][w];
(*P)[v][w] = w;
}
}
//Floyd算法实现
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])
{
(*D)[v][w] = (*D)[v][k] + (*D)[k][w];
(*P)[v][w] = k;
}
}
}
}
}