对所有区间 [ℓ,r] 的子图求点对最短路之和。固定左端点 ℓ,右端点逐个加点跑“增量 Floyd”,顺手累加。
枚举左端点 ℓ;让 r 从 ℓ 往右每次加入一个新点。 新点既是新端点、也是新中转点,用它跑一层 Floyd 即可把 [ℓ,r-1] 的最短路升级成 [ℓ,r] 的。
每个子图从头 Floyd 是 O(n⁵)=1e10。
增量加点后,整体约 n⁴/24≈4e6,n=100 轻松过。
Floyd 的本质:dist[i][j] 是“只许用某个中转点集合”时的最短路。
把点 r 加进来,就是多了一个允许的中转点。
① 接好 r 的直接边、把 r 的行列补成最优;
② 以 r 为中转更新所有点对 dist[i][j]=min(dist[i][j], dist[i][r]+dist[r][j])。
完事后当前矩阵就是子图 [ℓ,r] 的全源最短路。
图:1—2 权 1,2—3 权 2。蓝格是已算好的最短距离,黄格是刚加入的新点 r。灰格表示该点还没进子图。
Q1. 为什么固定左端点、只往右加点能省时间?
Q2. 加入新点 r 后,关键的一步更新是?
Q3. 两点在子图里不连通,距离按什么计入答案?
| 子图 [ℓ,r] | 可达点对距离 | 小计 |
|---|---|---|
| [1,2] | d(1,2)=1 | 1 |
| [1,3] | d(1,2)=1, d(1,3)=3, d(2,3)=2 | 6 |
| [2,3] | d(2,3)=2 | 2 |
| 其余(单点) | 无点对 | 0 |
| 总和 | 9 | |
e[u][v] 取最小边权。long long 并随时取模。