CSP-J 图论 · Floyd 第 1 梯 · 模板默写

B3647 【模板】Floyd

一张图 · 一个矩阵 · 三重循环 —— 把全源最短路写到闭眼也不会错。

一、先回答问题

结论

任意两点之间的最短路(全源最短路)。n≤100,正是 Floyd 的主场:
三重循环 k → i → j,每次问一句“经过 k 中转会不会更近”

教学安排

本节只做一件事:让丁把这 6 行循环默写出来
重点不是难度,而是把「k 必须在最外层」刻进肌肉记忆。

二、核心观察

关键

最外层的 k 表示:“现在允许借用第 k 个点当中转站”

当 k 从 1 数到 n,每个点都轮流“开放”成中转站一次, dist[i][j] 就逐步考虑了所有可能的绕路 —— 最终一定是真正的最短路。

一句话公式
dist[i][j] = min( dist[i][j], dist[i][k] + dist[k][j] );

三、互动演示:看 k 一层层“开放”

样例:4 个点的环 1-2-3-4-1,每条边权 1。∞ 表示暂时走不通。

四、自己选答案

Q1. 三重循环里,哪个变量必须放在最外层?

Q2. 题目说“可能有重边”,读入时应该怎么处理同一对点的多条边?

Q3. 把 INF 设成 INT_MAX 可能出什么问题?

五、手推结果(样例最终矩阵)

1234
10121
21012
32101
41210
对角线全 0;环上相邻点是 1;隔一个点是 2。和样例输出完全一致。

六、C++14 参考代码

可直接默写
初始化:对角线 0,其余 INF;用 0x3f3f3f3f 这种“加法不溢出”的值。
无向图 + 重边:双向赋值,并用 min 保留最短的一条。
循环顺序k 最外、i,j 在内 —— 这是全题唯一的“死规定”。

七、接着练(同梯度)