目的-求每对顶点之间的最短路径
使用动态规划的思想, 将问题的求解分为多个阶段
对于n个顶点的图G, 求任意一对顶点v1->vj之间的最短路径可以分为以下几个阶段:
- 初始状态-不允许在其他顶点中转, 最短路径?
- 若允许在V0中转, 最短路径?
- 若允许在v0,v1中转, 最短路径?
- 若允许在v0,v1,v2中转, 最短路径?
- ...
- 若允许在v0,v1,v2,...,vn中转, 最短路径?
算法说明
k为中转顶点, i, j为路径的两端顶点.
当k, i, j 互不相等时,(相等时没有计算的必要)
若 A(k)[i][j] > A(k)[i][k] + A(k)[k][j],
则 A(k)[i][j] = A(k)[i][k] + A(k)[k][j];
path(k)[i][j] = k.
否则 A(k) 和 path(k) 保持原值.
C语言代码实现
double dist[MAX][MAX]; // 距离数组
int path[MAX][MAX]; // 前驱点数组
void Floyd(struct AMG_Graph* graph)
{
int k, i, j;
for (k = 0; k < graph->vex_num; ++k)
{
for (i = 0; i < graph->vex_num; ++i)
{
for (j = 0; j < graph->vex_num; ++j)
{
if (k != i && k != j && i != j) {
if (dist[i][j] > dist[i][k] + dist[k][j])
{
dist[i][j] = dist[i][k] + dist[k][j];
p[i][j] = k;
}
}
}
}
}
}