思路分析
题目要求依次删点,每次删之前求所有点对最短路之和。
关键技巧:倒序处理,把"删点"变成"加点"。
删点的逆序就是加点。倒着看删除序列 xn,xn−1,…,x1x_n, x_{n-1}, \ldots, x_1xn ,xn−1 ,…,x1 ,相当于依次加入点。每次加入一个新点 kkk 时,用 Floyd 的思想:用 kkk 作为中转点,更新所有已存在的点对之间的最短路。
d[i][j]=min(d[i][j],d[i][k]+d[k][j])d[i][j] = min(d[i][j], d[i][k] + d[k][j]) d[i][j]=min(d[i][j],d[i][k]+d[k][j])
这恰好就是 Floyd 的第 kkk 层循环——Floyd 本质上就是"逐个加入中转点"。
代码
核心思想图示
Floyd 算法 for k: for i: for j: d[i][j] = min(d[i][j], d[i][k]+d[k][j]) 的本质就是逐个加入中转点。把删点倒过来变成加点,每次加点就是 Floyd 的一层,天然匹配。