1. Floyd算法:动态规划视角下的最短路径求解
Floyd算法就像一位经验丰富的交通规划师,手持城市地图挨个检查每个十字路口:"如果把这个路口作为中转站,能不能让某些路线变得更短?"这个看似简单的思路,背后却蕴含着动态规划的深刻思想。
我们先来看算法的核心代码实现:
python复制def floyd(graph):
n = len(graph)
dist = [[0]*n for _ in range(n)]
# 初始化距离矩阵
for i in range(n):
for j in range(n):
dist[i][j] = graph[i][j]
# 三重循环更新最短路径
for k in range(n):
for i in range(n):
for j in range(n):
if dist[i][k] + dist[k][j] < dist[i][j]:
dist[i][j] = dist[i][k] + dist[k][j]
return dist
1.1 为什么需要独立的距离矩阵?
新手最容易犯的错误就是直接在原始图上修改。想象你正在规划城市A到城市C的路线,如果直接在原矩阵上更新距离,那么后续计算城市B到城市D时,可能就会用到已经被污染的A-C距离数据。这种"脏读"会导致整个算法失效。
专业提示:dist矩阵的创建本质上是一种"写时复制"技术,它保证了在每一轮迭代中,所有距离比较都是基于上一轮完整、一致的状态。
1.2 三重循环的深层逻辑
最外层的k循环控制着中间节点的选择顺序。以中国城市为例,当k=武汉时,算法会检查所有以武汉为中转的路线是否更优:
code复制北京->武汉->广州 比 北京->广州 快吗?
上海->武汉->成都 比 上海->成都 快吗?
...
这种检查会依次对每个城市(k)作为中转站进行,确保不遗漏任何可能的优化路径。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动态规划思想的完美体现
2.1 最优子结构特性
Floyd算法的核心在于其动态规划特性。
