题目描述
给定一张带权无向图,求图中至少包含
3
3
3个点的环,环上节点不重复,并且环上的边的长度之和最小。请你求出最小环的方案,本题开启SPJ
。
题解
我们采用Floyd
求解。
考虑Floyd
的求解过程,当外层循环
k
k
k刚自增加完开始枚举一个新值时,
d
[
i
,
j
]
d[i,j]
d[i,j]保存着“经过编号不超过
k
−
1
k - 1
k−1的节点”从
i
i
i到
j
j
j的最短路长度。
于是, min 1 ≤ i < j < k { d [ i . j ] + a [ j , k ] + a [ k , i ] } \min_{1 \leq i < j < k}{\{d[i.j] + a[j,k] + a[k,i]\}} min1≤i<j<k{d[i.j]+a[j,k]+a[k,i]}就是满足以下两个条件的最小环长度:
- 又编号不超过 k k k的节点构成。
- 必然经过节点 k k k。
上式中的 i , j i,j i,j相当于枚举了环上与 k k k相邻的两个点。故以上结论显然成立。
∀ k ∈ [ 1 , n ] \forall k \in [1,n] ∀k∈[1,n],都对上式进行计算,取最小值,即可得到整张图的最小环。
问题回答
Q Q Q:我们每次都只考虑所有编号不大于 k k k的点且必然经过 k k k号点的环,而没有考虑编号大于 k k k的节点或者最小环不过 k k k的情况,为什么答案还是对的?
A A A:可以这么想:首先,对于一张图,答案的最小环是一定至少由 3 3 3个节点构成的,而且这些节点编号也都在 [ 1 , n ] [1,n] [1,n]中。我们单独拉出来这个环中的任何一个节点,假设编号为 k k k,与它相邻的两个节点的编号假设为 a a a和 b b b,那么这个环可以被表示为: a − k − b − a a - k - b - a a−k−b−a
这就是我们客观答案中给出的最小环的形式,既然环上边权和最小,所以 a − b a - b a−b间一定走的是最短路径(为何必须是”最短路“,这里稍稍解释一下:还是上面的这个环,我们假设是最终答案,即最小环,环上权值和最小,如果 a − b a - b a−b间的路径不是最短路,就一定存在一个更短的可以替换下这个次短的,从而让环权值和变得更小,这和我们的假设的最小环矛盾,故得证,一定要是最短路才行)
而我们枚举了所有可能的 a a a和 b b b,如果外层循环枚举的 k k k恰好是客观答案中环上的一个点,则当我们枚举的 a a a和 b b b是 k k k两侧的点的时候,我们计算出的答案就是最终的客观答案了,恰好我们又在所有可能的方案中取了最小,这个答案就一定是最小的了。最后输出就行(毕竟还有谁,能比客观理论最小环更小呢)。
其实,上面这种从答案的角度理解dp过程的方法在理解Floyd算法的时候也是很好用的。总体来说,就是:一、答案客观存在 二、我们枚举的时候一定有一个时刻能枚举到答案的情况,并且记录了结果(和其他所有方案在一起取最小),并且由于确实是答案(也就是理论最小)没有人能比它优秀,所以最终它就成了最优答案而被输出出来,得到正确结果。
没有理解的朋友,强烈建议自己画个图,模拟dp的过程,你就会发现,上面的解释真的太对了