2023.8.15 分数规划+网络流杂题选做
分数规划
其实长得就像带权二分
以下面这道题为例:
给定一个有向图 每条边都有价值\(c\)和代价\(p\) 选出一个环 使环上所有边的价值之和与代价之和的比值最小
我们考虑二分答案
设当前答案为 \(mid\) 我们假设 \(\frac{\sum c}{\sum p} < mid\)
移项 得 \(\sum c < mid * \sum p\)
把 \(mid\) 弄进去 得 \(\sum c < \sum p * mid\)
再移项并合并 得 \(\sum c - p * mid < 0\)
思考这个式子的意义 就是说如果我对于条边 我把其边权变为 c - p * mid
那么我们要找的环一定以负环的形式出现
所以我们二分 \(mid\) 然后用 \(SPFA\) 或 \(Bellman\operatorname-Ford\) 判负环即可
洛谷相似题:[HNOI2009] 最小圈
网络流
基础知识点见 网络流学习笔记
圆桌问题
自己做出来了
一排点表示每个公司的客人 另一排表示餐桌
源点往左边的点连边 流量为客人总数
右边的点往汇点连边 流量为餐桌人数上限
然后跑最大流就行了
思考这题给我们什么启发:对于给定集合数 然后每个集合里元素上限给定 问能否使每个元素被包含指定次问题 用该方法解决
最长不下降子序列问题
首先第一问非常白给 设 \(f_i\) 表示前 \(i\) 个数的最长不降子序列长度
则有 \(f_i = \max\limits_{j = 1}^{i - 1} {f_j} (a_j \le a_i)\)
然后这题 \(n\) 很小 直接 \(O(n^2)\) 暴力转移即可 当然如果你乐意可以用树状数组来做到 \(O(nlogn)\)
考虑第二问和第三问 对于每个 \(f_i\) 我们把能转移到它的 \(f_j\) 连一条 \(j \rightarrow i\) 的边
然后对于所有 \(f_i = ans\) 的点都连到汇点 所有 \(f_i = 1\) 的点都连到源点
那么对于第二问 每个点只经过一次 就拆入度出度跑最大流
对于第三位 直接跑最大流即可
启发:用网络流直观表现出 \(DP\) 转移过程 进而实现一些如求方案数的操作
分配问题
也是自己做出来的一道题
直接跑最小费用最大流 建图啥的都很显然 略过不讲(
[SCOI2007] 修车
很暴力的想法 把每个工人拆成 \(n\) 个点 表示它是第几个修车的
但是发现这条边的费用由前面修车的人决定
我们转而考虑每个人的贡献 假如它是第一个人修车的 然后这个点一共有 \(k\) 个人修车 那么他对总等待时长的贡献就是 \(w * k\)
那么我们考虑 如果他是倒数第 \(i\) 个修车的 那么他对总等待时长的贡献就是 \(w * i\)
所以我们还是拆成 \(n\) 个点 但是表示他是倒数第几个修车的
然后边权就上面说的那玩意
然后跑最小费用最大流即可

浙公网安备 33010602011771号