From 3ad846a3121ce6f7f7ba39d0fc63c269a5096298 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Wed, 3 Jan 2024 16:57:41 +0800 Subject: [PATCH] 'commit' --- TangDou/AcWing_TiGao/T3/Floyd/344.md | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/TangDou/AcWing_TiGao/T3/Floyd/344.md b/TangDou/AcWing_TiGao/T3/Floyd/344.md index dfe7733..dda5396 100644 --- a/TangDou/AcWing_TiGao/T3/Floyd/344.md +++ b/TangDou/AcWing_TiGao/T3/Floyd/344.md @@ -37,13 +37,33 @@ $1≤N≤100,1≤M≤10000,1≤l<500$ ### 二、算法思路 -![](https://cdn.acwing.com/media/article/image/2021/12/18/85607_ee5522ae60-g.png) +![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202401031636536.png) +最优化问题,可以从集合角度来思考,从集合角度来思考的一个好处就是:不容易丢东西。 -$floyd$是 **插点** 算法,在点$k$被 **插入前** 可计算$i \rightarrow x \rightarrow j,x \in [1 \sim k-1]$这样的最短路,当然,也可以不选择任何一个中间点,$dist[i][j]$天生最小。 +![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202401031639098.png) -枚举所有以$k$为环中 **最大节点** 的环即可。 +按环上编号最大点的编号为分类依据,分完类之后,只需要分别求一个每一类的最小值,然后$PK$一下求$min$所有最小值就是答案。 +每一类的最小值怎么求呢?我们来加快一下$floyd$的过程: + +```cpp {.line-numbers} +for(int k=1;k<=n;k++) //K是要插入的点,dis[i][j]数组相当是知道了i~j的只经过1~k-1这些点的最小路径 + //此时在这个地方可以求第k类。从某个点连接到k + for(int i=1;i<=n;i++) + for(int j=1;j<=n;j++){ + + } +``` +![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202401031648374.png) + +枚举一下所有的点对(i,j),固定了(i,j)之后,那么$i-k$,$k-j$的长度都是固定的。 + +![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202401031650078.png) + +本题还有一个难点,就是$floyd$需要记录方案,其实就是求一下$d[i][j]$是由哪个中间点转移过来的。 + +k的含义:不算i,j的情况下,中间点里的最大值。 #### $Code$ ```cpp {.line-numbers}