最小乘积模型小计
前言
笔者在做网络流的时候碰到了这道题,拼尽全力无法战胜,遂看题解,我发现前置知识有最小乘积模型。我感觉这个东西很厉害,于是尝试学习并写一篇文章讲讲这个东西。
引入
这个题每条边上有 \(a,b\) 两个权值,让你求一棵生成树满足:
最小。
做法
我们令 \(x=\sum a,y=\sum b\),将每棵生成树都刻画成平面上的点 \((x,y)\),而我们要求的就是这些点所在的反比例函数中 \(k\) 值最小的点,而这个点一定在这些点围成的下凸壳上,这是显然的。
于是我们的思路就是从两个端点开始在凸壳上分治。端点的选取是容易的,我们可以选择 \(x\) 最小的点 \(A\) 和 \(y\) 最小的点 \(B\)。每次我们要找到一个分治中心 \(C\),对 \(C\) 进行一次计算答案,然后递归到两个子凸壳 \((A,C)\) 和 \((C,B)\) 上。现在的问题就是我们怎么去选择 \(C\),考虑是下凸壳所以我们找一个点 \(C\) 使得 \(S_{\triangle ABC}\) 最大,也就是 \(\overrightarrow{AB}\times\overrightarrow{AC}\) 最小,因为其值为负。
我们考虑将叉积拆开,有:
所以我们要找 \((y_A-y_B)x_C+(x_B-x_A)y_C\) 的最小值。于是我们在跑最小生成树算法的时候讲边权设为 \((y_A-y_B)a_i+(x_B-x_A)b_i\) 即可。
总结
对于一个元素有两种代价 \(a,b\) 并且最后需要最小化 \(\left(\sum a\right)\times\left(\sum b\right)\) 的时候我们考虑将其放在一个平面上。我们要做的实际是在下凸壳上找到一个最优点,这个过程可以分治解决。而在分治过程中对分治点的选择又依赖于下凸壳的特性,所以我们选择能围成三角形面积最大的点,然后对这个点计算答案并进行更新。

浙公网安备 33010602011771号