提示:
1. 看到题目 , 最短路? 最小费用流?(博主才做完图论回来做这道题的第一反应) ... 可能你会想到枚举对应关系然后写k个最短路 ,但是可能存在一些点彼此联通 , 共用一些边 导致独立求最短路的情形是错误的。 我们不妨先将问题弱化一下 , 如果求这些点(前K个 和 后K个)彼此都联通, 你想到了什么?
2. 看完提示1 没有思路说明你和当时博主一样不熟悉一个根据动态规划为原理 , 广泛应用于组合的囊括最小生成树的一种树 , 斯坦纳树
3. 斯坦纳树算法就能求使一个给定点集内点彼此联通的最小代价(所包含的边可以是连接这个点集以外的点) , 如果用提示1.中的弱化问题 , 这就是一个裸的斯坦纳树题目(其方法会在之后介绍)
4. 假设你能够求出给定点集的斯坦纳树 , 你还是无法想出此题的思路往下看。 本题并不要求所有点联通 , 但至少两两联通 , 那么可以把答案看成几颗斯坦纳树 , 你的任务就是枚举这些树的可能形态 , 后来你会发现 , 那也是个动态规划 (dp是思想 , 不是具体方法)
5. 斯坦纳树网上有很多文章 , 可以到网上搜详细讲解 , 这里只给出dp状态转移方程和评价:
d [i] [s] : 以i 为树根 , 包含集合s中所有点(s用二进制表示 , 并且s仅是所选点集中的点) , 不难发现状态数为 n*(2^k) // n为节点数 , k 为所选点的个数
这里强调一下dp中一个重要概念 , 状态的顺序 , 如果两个状态a , b , a的dp值可以影响b的dp值 ,但是b的dp值不能影响a的dp值 , 简单点说就