「一本通 3.2 例 1」Sightseeing Trip(观光之旅) 题解

该博客探讨了一种利用Floyd算法求解带权无向图中包含至少333个节点且边权和最小的环的方法。通过分析Floyd算法的迭代过程,解释了为何只考虑编号不超过kkk的节点且必经点kkk的环仍然能够找到全局最小环。博主强调了在枚举过程中,由于答案的唯一性和Floyd算法的特性,最终输出的一定是图的最小环。建议读者通过绘制图形和模拟动态规划过程来加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定一张带权无向图,求图中至少包含 3 3 3个点的环,环上节点不重复,并且环上的边的长度之和最小。请你求出最小环的方案,本题开启SPJ

题解

我们采用Floyd求解。

考虑Floyd的求解过程,当外层循环 k k k刚自增加完开始枚举一个新值时, d [ i , j ] d[i,j] d[i,j]保存着“经过编号不超过 k − 1 k - 1 k1的节点”从 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]\}} min1i<j<k{d[i.j]+a[j,k]+a[k,i]}就是满足以下两个条件的最小环长度:

  1. 又编号不超过 k k k的节点构成。
  2. 必然经过节点 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 akba

这就是我们客观答案中给出的最小环的形式,既然环上边权和最小,所以 a − b a - b ab间一定走的是最短路径(为何必须是”最短路“,这里稍稍解释一下:还是上面的这个环,我们假设是最终答案,即最小环,环上权值和最小,如果 a − b a - b ab间的路径不是最短路,就一定存在一个更短的可以替换下这个次短的,从而让环权值和变得更小,这和我们的假设的最小环矛盾,故得证,一定要是最短路才行)

而我们枚举了所有可能的 a a a b b b,如果外层循环枚举的 k k k恰好是客观答案中环上的一个点,则当我们枚举的 a a a b b b k k k两侧的点的时候,我们计算出的答案就是最终的客观答案了,恰好我们又在所有可能的方案中取了最小,这个答案就一定是最小的了。最后输出就行(毕竟还有谁,能比客观理论最小环更小呢)。

其实,上面这种从答案的角度理解dp过程的方法在理解Floyd算法的时候也是很好用的。总体来说,就是:一、答案客观存在 二、我们枚举的时候一定有一个时刻能枚举到答案的情况,并且记录了结果(和其他所有方案在一起取最小),并且由于确实是答案(也就是理论最小)没有人能比它优秀,所以最终它就成了最优答案而被输出出来,得到正确结果。

没有理解的朋友,强烈建议自己画个图,模拟dp的过程,你就会发现,上面的解释真的太对了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值