分数规划
分数规划
分数规划是一个解决如下类似题目的技巧:
给定 \(a_1,a_2,...,a_n\),\(b_1,b_2,...,b_n\),求 \(\displaystyle \frac{\sum_{i=1}^n a_ix_i}{\sum_{i=1}^n b_ix_i}\) 的最大/小值,其中 \(x_i \in [0,1]\)。也就是说在 \(n\) 个物品里选一些,求权值 \(a\) 的和与权值 \(b\) 的和相除的最大/小值。
这类问题常用二分解决。
钦定一个二分值 \(mid\),我们考虑转化这个柿子:
只需求左式最大值即可。
板子很简单,所以经常会给出一些需要满足的额外条件,如分母必须大于某个数之类。
分数规划主要作为一种 trick 出现在竞赛中,经常与其他算法相结合(主要是二分,check 时根据不同情景利用不同算法找 \(\displaystyle \sum_{i=1}^n x_i \times (a_i-mid \times b_i)\) 极值)。
P4377 [USACO18OPEN] Talent Show G
求 \(\displaystyle \frac{\sum_{i=1}^n t_ix_i}{\sum_{i=1}^n w_ix_i}\) 的最大值,要求 \(\displaystyle \sum_{i=1}^n w_ix_i \ge W\)。
这道题给分母加上了一个最小值的限制。此时在 check 函数中,我们需要求满足 \(\displaystyle \sum_{i=1}^n w_ix_i \ge W\),\(\displaystyle \sum_{i=1}^n x_i \times (t_i-mid \times w_i)\) 的最大值。
观察发现,我们可以将其转化成一个 01 背包问题,其中 \(t_i-mid \times w_i\) 为权值,\(w_i\) 为重量。这道题就可以做完了。
需要注意的是当 \(\displaystyle \sum_{i=1}^n w_ix_i \ge W\) 时可直接将其视为 \(W\)。(原因很简单自己想)
平面直角坐标系上有 \(n\) 个点,第 \(i\) 个点的坐标为 \((x_i,y_i)\),并且每个点都有一个权值 \(z_i\),每个点之间互相连边,令 \(a\) 为边长,\(b\) 为两点的 \(z\) 的差的绝对值,求一个生成树(边集为 \(E\))使 \(\displaystyle \frac{\sum_{e \in E} a_e}{\sum_{e \in E} b_e}\) 最小。
按照分数规划的套路,每次 check,我们令每条边的边权为 \(a-mid \times b\),然后跑最小生成树即可。
注意到图为完全图,可使用 Prim 算法,效率更快。
有一个图,令 \(w\) 为边权,在图上找到一个环(边集为 \(E\),长度为 \(k\))使 \(\displaystyle\frac{\sum_{e \in E} w_e}k\) 最小。
令每条边权值为 \(w_e-mid\),由于要看最小值是否小于 \(0\),我们只需要判断是否能在当前图上找到一个负环即可。
SPFA 最有用的一集(bushi

浙公网安备 33010602011771号