买还是建
这一道题目,我们看到
对每种组合,我们想要求出必须选择这些组合的MST,也即“含有必须边的MST”(尽管现在还不清楚每个组合的边是什么,下文会说)
这种情况跟陈立杰出的那道“tree”非常像,我们只用把必须边的边权缩小放到前面然后跑Kruscal即可
那为什么步骤一要求MST?如何保证正确性?
这是为了缩小复杂度,正确性可以从Kruscal的过程进行考虑。通过prim求出的MST显然也可以通过Kruscal求出,假设我们通过Kruscal求出了步骤一所求的MST,那么我们现在把必须边全部放到前面了,再跑一次Kruscal,原来没被选择的边一定不会被选择(因为现在还多了边形成连通块了,没被选择的边所连接的两个点一定在同一连通块内),被选择的边不一定会被选择,所以我们只用保留原来被选择的边即可,跑完之后一定是MST
到这里就可以回答一下最开始的问题,我们不用关心
update 2024.5.23
重新做这道题目的时候,就是一直在想对每个组合都去求一次prim的最小生成树
然而这样子的话显然复杂度爆炸了
所以这道题目启示我们,如果要对一个图反复地求MST,可以像上面这样优化时间复杂度(先求一次MST,没有被选中的边就可以直接舍弃了)
update 2024.8.17
重新做一遍花了二十分钟做出来了。实际上这种技巧非常常见,即删除MST多余的边
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构