斯坦纳树
给一张图,其中一些点称为关键点。
斯坦纳树的定义就是能覆盖关键点的连通子图,为什么叫连通子图,可以发现答案子图可以为一棵树,否则如果有环,可以删去环上任意一条边,新图也联通。
#
题意:给定一张带权无向图,其中有一些点是关键点,求连通子图的最小长度。
可以发现答案子图一定为一棵树,否则如果有环,可以删去环上任意一条边,新图也联通。
这是个 NP-hard 问题,可能没办法在多项式时间复杂度内(
子图的状态肯定无法压进 dp,考虑将关键点的状态压进 dp。
由于答案是一棵树,可以设
我们可以将以
分讨:
的度数为 ,则这个点的转移来自于他唯一的连边,我们就考虑通过 的相邻点来转移,设这个点为 ,则
的度数大于 ,则可以将这个图分成 的若干个子树,就可以通过枚举子集转移:
实现方面,对于第一种转移,可以想到最短路算法的松弛操作,将整张图松弛,先将整张图更新的点扔进队列,然后用第一种转移的转移式更新整张图的
可以发现图是比较稀疏的,可以复活死去的
对于第二种转移,直接枚举子集,复杂度
讲一下枚举子集的时间复杂度,之前一直不是很懂。
设集合大小为
枚举的总复杂度就是
最后
游览计划#
可以发现这题很板,只是加了一个点权转边权和输出方案。
输出方案在每次转移时加一个
点权转边权可以考虑将第二个转移改成
因为两边我们都算了一次
信仰不渝
Unswerving faith
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律