求一个图中各个点之间的距离,弗洛伊德算法无疑是非常简单的,但是以前只会求每个点之间的dist,(最短距离),不会求最短距离的路径怎么走,没有理解path最后怎么输出
先看算法核心代码
初始化注意:
1.path[i][j] = j
2.dist对角线为零
核心代码:
for(int i = 0; i <= 13; i++) for(int j = 0; j <= 13; j++) for(int k = 0; k <= 13; k++) { if(dist[j][k] > dist[j][i] + dist[i][k]) { dist[j][k] = dist[j][i] + dist[i][k]; path[j][k] = path[j][i]; } }
注: 1. i为每次加入的点
2.如果通过i到k 更近则更新dist与path
3.path存的是前驱,即由path[j][k] 即由j->k第一个需要经过的点。
所以在输出时应有如下代码
i->k 路径
int k = path[a1][a2]; if(a1 != a2) while(1) { cout<<"->"<<de[k]; if(k == a2) break; k = path[k][a2]; } cout<<endl;
依次输出中间的点并不断更新中间的点,当更新点到达k是则到达我们的目的,结束即可。
下边对弗洛伊德算法进行讨论
其能解决负权边的问题,但是其解决不了负权回路的问题,因为负权回路的图是没有最短路径的,最小是负无穷。