买还是建

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

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

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

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

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

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

update 2024.5.23

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

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

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

posted @ 2024-02-08 09:06  最爱丁珰  阅读(1)  评论(0编辑  收藏  举报