此为动态规划的思想,通过比较dist[i][j]与dist[i][k] + dist[k][j]来选择,而且k必须是外层循环,因为其是以k为子问题的,如果k在最里层,则很多子问题都没有算到。图的表示是矩阵表示,无直接边则为INF,自己到自己的距离为0.
//dist初始时有边的为正值,无边为INF,mid初始时都为0;mid的值应该是j的直接前驱,即i->……->mid->j
void graph::floyd(int dist[][1000], int mid[][1000])
{
int e_num = this->Enum;
int p_num = this->Pnum;
for (int i = 0; i < Pnum; i++)
for (int j = 0; j < Pnum; j++)
{
dist[i][j] = this->edge[i][j];
mid[i][j] = i;//这里的mid记录的是前驱,当ij直接相连的时候,j的前驱就是i
}
for (int k = 0; k < p_num; k++)
for (int i = 0; i < p_num; i++)
for (int j = 0; j < p_num; j++)
{
if (dist[i][j] > dist[i][k] + dist[k][j])
{
dist[i][j] = dist[i][k] + dist[k][j];
mid[i][j] = k;
}
}
}
打印的时候只需要对于 最短路径 1->5->4->3->6 有 mid[1][6] = 3; mid[1][3]= 4; mid[1][4] = 5; paht[1][5] =1 如此逆推不难得到 最短路径记录值 。