📅  最后修改于: 2023-12-03 15:28:47.613000             🧑  作者: Mango
给定 $n$ 个点和 $m$ 条无向边,选取 $k$ 个点作为门派,使得这 $k$ 个点构成一个联通块,并且其他 $n-k$ 个点都被至少一个门派所覆盖。求 $\min\limits_{k \leq i \leq n}{(i-k)w+\sum_{j=1}^kw_j}$,其中 $w_j$ 表示第 $j$ 个门派的点权,$w$ 表示每个点覆盖的代价。
第一行两个正整数 $n$,$m$。
接下来 $n$ 行,每行一个非负整数 $w_i$ 表示第 $i$ 个点的点权。
接下来 $m$ 行,每行两个正整数 $u$,$v$,表示一条连接 $u$ 和 $v$ 的边。
输出一个非负整数,表示最小花费。
5 5
0
6
2
6
1
1 2
2 3
3 1
3 4
4 5
9
2 0
0
0
0
此题是门派问题的一般形式,需要使用状压dp解决。具体地,设 $state$ 表示当前已经选择了哪些点,$dp[state]$ 表示选取 $state$ 中的点能够连接的所有点被完全覆盖的最小代价。则可以写出状态转移方程:$$dp[state]=\min\limits_{sub\subseteq state &&|sub|\ge k}{dp[sub]+(state-sub)w+\sum_{i\in sub}w_i}$$ 其中,$sub$ 是 $state$ 的一个子集,同时满足 $sub$ 中包含了至少 $k$ 个点。$(state-sub)w$ 表示剩余的没有被子集覆盖的点需要额外的代价,$\sum_{i\in sub}w_i$ 表示子集中的所有点所拥有的点权。
时间复杂度 $O(3^n)$。
最小割建图问题可以将问题转化为最大流求解。具体地,在原グラフ上新增一个超级源点 $s$ 和一个超级汇点 $t$,然后在门派之间建立一条容量为 $\infty$ 的边,最后在剩下的点与源汇点之间连一条容量为 $w$ 的边。显然,原问题的一个门派组合(即一组门派的点)对应于由源点向这些门派连边,由门派之间连边和由剩余点向汇点连边构成的一个割。原问题中的门派数 $k$ 可以转化为图中割的大小不小于 $k$,即不小于 $k$ 条总流量大于 $w$ 的边。因此,只需要遍历割边,找到一条割边集合中最小的,同时其连接的点的数量不小于 $k$。在遍历割边时只需要采用 Dinic 算法即可。
时间复杂度 $O(mn^2 \log w)$。
C++ 代码: