题意:给出n条无向带权边,求所有点的最小生成树,其中“Park”的度数不超过最后输入的k,输入保证有解。
思路:思路其实很好理解,分为几个步骤:
1.当然将“Park”作为根节点,一开始先删掉它,则原图会分为m个连通分量,分别记录它们的最小生成树,并记录每个分量与根的最小边,于是我们得到了根度数为m时的最小生成树。若k < m,则无解。
2.然后考虑将生成树上的一些边替换成与根相邻的边,若根与节点v有边连接且这条边不在生成树上,则假设连接这条边,那么我们必须删去一条原生成树的边,且这条边一定是原生成树中v到根节点的链上最长的边(我的做法是每次开始前DFS维护所有节点的这条对应边),设其长为len,则生成树大小可减少 len - w[root][v]。每次找到一条最优的边,直到根度数达到k或生成树已经最小。
代码:
#include
#include
#include
#include