首先确定守卫的位置已经是二分图匹配了,考虑用网络流解决这题。考虑已经选完守卫了,该怎么刻画连通块的限制,题目的条件可以转化为将所有点划分成恰好 $k$ 个连通块,使得所有一个连通块中都有至少一个守卫。观察一下可以发现,最终答案中的所有边都在原图的最小生成树上。所以考虑刻画成对于每条边,选择一个方向,表示将指向的点拉入连通块。考虑具体怎么建模,将这 $n$ 个点向 $T$ 连容量为 $1$ 的边,表示每个点要么是守卫,要么是被拉入连通块的。让 $S$ 向 $S1$ 连容量为 $k$ 的边,表示选择 $k$ 个守卫,向 $S2$ 连容量为 $n-k$ 的边,表示剩下 $n-k$ 个点是被拉进来的。$S1$ 向每个集合连边,集合向集合内的点连边,表示选择守卫的过程。$S2$ 向每条生成树上的边连容量为 $1$ 费用为边权的边,每条边向两个端点连边,表示给边定向。
考虑这么做的正确性,若连通块个数大于 $k$,则至多有 $n-k-1$ 个点是被拉入的,所以不是满流,若有连通块没有守卫,则该连通块会有一个非守卫被钦定为树根,所以同样至多有 $n-k-1$ 个点是被拉入的。现在只有连通块个数小于 $k$ 且每个连通块都有守卫的情况了,这种情况下必定存在一个连通块中至少两个守卫,将其分成两个有一个守卫的连通块显然更优,所以不会计入答案。
所以跑最小费用最大流就行,$O(fn^2)$ 即 $O(n^3)$。