买还是建

这一道题目,我们看到q非常小,所以可以尝试从q入手

对每种组合,我们想要求出必须选择这些组合的MST,也即“含有必须边的MST”(尽管现在还不清楚每个组合的边是什么,下文会说)

这种情况跟陈立杰出的那道“tree”非常像,我们只用把必须边的边权缩小放到前面然后跑Kruscal即可

那为什么步骤一要求MST?如何保证正确性?

这是为了缩小复杂度,正确性可以从Kruscal的过程进行考虑。通过prim求出的MST显然也可以通过Kruscal求出,假设我们通过Kruscal求出了步骤一所求的MST,那么我们现在把必须边全部放到前面了,再跑一次Kruscal,原来没被选择的边一定不会被选择(因为现在还多了边形成连通块了,没被选择的边所连接的两个点一定在同一连通块内),被选择的边不一定会被选择,所以我们只用保留原来被选择的边即可,跑完之后一定是MST

到这里就可以回答一下最开始的问题,我们不用关心Ai里面的边到底是什么,假设Ai一共有k个点,随便选k1条边就可以了,只要这些边的边权为0,因为我们不关心Ai的具体样子,他只要联通就好了(事实上,就算把Ai中的两两连线全部加入Kruscal的过程,当某一个套餐的点完全连通后,这个套餐剩下的边肯定都不会再选择了,从Kruscal的过程我们也可以证明正确性)

update 2024.5.23

重新做这道题目的时候,就是一直在想对每个组合都去求一次prim的最小生成树

然而这样子的话显然复杂度爆炸了

所以这道题目启示我们,如果要对一个图反复地求MST,可以像上面这样优化时间复杂度(先求一次MST,没有被选中的边就可以直接舍弃了)

update 2024.8.17

重新做一遍花了二十分钟做出来了。实际上这种技巧非常常见,即删除MST多余的边

posted @   最爱丁珰  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示