Floyd算法
问题描述:对于一个各边权值均大于零的有向图,对每一对顶点i≠j,求出顶点i与顶点j之间的最短路径和最短路径长度。
多源最短路径问题: Floyd算法
假设有向图G=(V,E)采用邻接矩阵存储。设置一个二维数组A用于存
放当前顶点之间的最短路径长度,分量A[I] [j] 表示当前顶点i j的最短路
径长度。
递推产生一个矩阵序列:
A0 A1 … Ak … An-1。
算法:迭代(递推)思路
Ak[i][j]: i j的路径上所经过的顶点编号不大于k的最短路径长度。
算法设计(解决2个问题)
(1)用二维数组A存储最短路径长度:
Ak[i][j]表示考虑顶点0~k后得出的i j的最短路径长度。
An-1[i][j]表示最终的i j的最短路径长度。
(2)用二维数组path存放最短路径:
pathk[i][j]表示考虑顶点0~k后得出的i j的最短路径。
pathn-1[i][j]表示最终i j的最短路径。
void Floyd(MatGraph g) //求每对顶点之间的最短路径
{
int A[MAXVEX][MAXVEX]; //建立A数组
int path[MAXVEX][MAXVEX]; //建立path数组
int i, j, k;
for (i=0;i<g.n;i++)
for (j=0;j<g.n;j++)
{
A[i][j]=g.edges[i][j];
if (i!=j && g.edges[i][j]<INF)
path[i][j]=i; //i和j顶点之间有一条边时
else //i和j顶点之间没有一条边时
path[i][j]=-1;
}
for (k=0;k<g.n;k++) //求Ak[i][j]
{
for (i=0;i<g.n;i++)
for (j=0;j<g.n;j++)
if (A[i][j]>A[i][k]+A[k][j]) //找到更短路径
{
A[i][j]=A[i][k]+A[k][j]; //修改路径长度
path[i][j]=path[k][j]; //修改最短路径为经过顶点k
}
}
}