这一部分,我们开始讲求最短路径的另一个算法,这个算法就是实现了求所有节点到所有节点的最短路径。直接上代码看看:
#include "stdio.h"
#define MAXVEX 9
#define INFINITY 0xffff
typedef int pathmatirx[MAXVEX][MAXVEX];
typedef int shortPathTable[MAXVEX][MAXVEX];
typedef char VertexType;
typedef struct
{
VertexType vexs[MAXVEX];
int matirx[MAXVEX][MAXVEX];
int namVertexes, numEdges;
}MGraph;
void shortestPath_Floyd(MGraph G, pathmatirx *p, shortPathTable *D)
{
int v, w, k;
for (v = 0; v < G.namVertexes; ++v)
{
for (w = 0; w < G.namVertexes; ++w)
{
(*D)[v][w] = G.matirx[v][w]; // D[v][w]值即为对应点间的权值
(*p)[v][w] = w; // 初始化P
}
}
for (k = 0; k < G.namVertexes; ++k)
{
for (v = 0; v < G.namVertexes; ++v)
{
for (w = 0; w < G.namVertexes; ++w)
{
if ((*D)[v][w] > (*D)[v][k] + (*D)[k][w])
{
(*D)[v][w] = (*D)[v][k] + (*D)[k][w];
(*p)[v][w] = (*p)[v][k];
}
}
}
}
for (v = 0; v < G.namVertexes; ++v)
{
for (w = v + 1; w < G.namVertexes; w++)
{
printf("v%d-v%d weight: %d",v, w, (*D)[v][w]);
k = (*p)[v][w];
printf("path: %d", v);
while (k != w)
{
printf(" -> %d", k);
k = (*p)[k][w];
}
printf(" -> %d\n", w);
}
printf("\n");
}
}
int main(void)
{
shortPathTable weight;
pathmatirx path;
MGraph G = {.matirx = {{0, 1, 5, INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, INFINITY},
{1, 0, 3, 7, 5, INFINITY, INFINITY, INFINITY, INFINITY},
{5, 3, 0, INFINITY, 1, 7, INFINITY, INFINITY, INFINITY},
{INFINITY, 7, INFINITY, 0, 2, INFINITY, 3, INFINITY, INFINITY},
{INFINITY, 5, 1, 2, 0, 3, 6, 9, INFINITY},
{INFINITY, INFINITY, 7, INFINITY, 3, 0, INFINITY, 5, INFINITY},
{INFINITY, INFINITY, INFINITY, 3, 6, INFINITY, 0, 2, 7},
{INFINITY, INFINITY, INFINITY, INFINITY, 9, 5, 2, 0, 4},
{INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, 7, 4, 0}},
.namVertexes = MAXVEX
};
shortestPath_Floyd(G, &path, &weight);
printf("Floyd\n");
return 0;
}
看代码,p数组存放的是对应两个节点之间的前驱节点,我感觉看了代码之后基本能够说明这个算法了,就不再详细说了。这个算法的复杂度高O(n3),如果你是需要求所有节点到所有节点的最短距离,那么你就可以使用这个算法。