前面我们介绍了单源最短路径算法 – Dijkstra和bellman_ford算法。

今天我们将进入多源最短路径算法的章节。

Floyd算法原理是动态规划,同时可以处理权值为正负的图。

例如我们需要计算节点1到节点9的最短路径,那么我们可以计算节点1到节点5的最短路径+节点5到节点9的最短路径。这样就将一个大问题分解为很多个小问题。

那么问题是我们不知道中间的节点是什么,索性全部遍历一遍全部的节点作为中间节点找最小的路径总和即可。

Q : 那么遍历顺序为何是中间节点在最外面呢?

A : 因为动态规划下一个状态需要上一个状态的值,故i,j只能在内循环。

真题演练:小明逛公园

代码如下:

需要注意的是,该题目对grid数组初始化不能使用INT_MAX,否则在计算grid[i][k] + grid[k][j]时会溢出成为负数,最后取min(grid[i][j], grid[i][k] + grid[k][j])时出错。