图的应用 - Floyd算法

119 阅读1分钟

目的-求每对顶点之间的最短路径

使用动态规划的思想, 将问题的求解分为多个阶段

对于n个顶点的图G, 求任意一对顶点v1->vj之间的最短路径可以分为以下几个阶段:

  1. 初始状态-不允许在其他顶点中转, 最短路径?
  2. 若允许在V0中转, 最短路径?
  3. 若允许在v0,v1中转, 最短路径?
  4. 若允许在v0,v1,v2中转, 最短路径?
  5. ...
  6. 若允许在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) 保持原值.

image.png

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;
					}
				}
			}
		}
	}
}