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] 最小圈


网络流

基础知识点见 网络流学习笔记

圆桌问题

luogu link

自己做出来了
一排点表示每个公司的客人 另一排表示餐桌
源点往左边的点连边 流量为客人总数
右边的点往汇点连边 流量为餐桌人数上限
然后跑最大流就行了

思考这题给我们什么启发:对于给定集合数 然后每个集合里元素上限给定 问能否使每个元素被包含指定次问题 用该方法解决

最长不下降子序列问题

luogu link

首先第一问非常白给 设 \(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\) 转移过程 进而实现一些如求方案数的操作

分配问题

luogu link

也是自己做出来的一道题
直接跑最小费用最大流 建图啥的都很显然 略过不讲(

[SCOI2007] 修车

luogu link

很暴力的想法 把每个工人拆成 \(n\) 个点 表示它是第几个修车的
但是发现这条边的费用由前面修车的人决定

我们转而考虑每个人的贡献 假如它是第一个人修车的 然后这个点一共有 \(k\) 个人修车 那么他对总等待时长的贡献就是 \(w * k\)
那么我们考虑 如果他是倒数第 \(i\) 个修车的 那么他对总等待时长的贡献就是 \(w * i\)
所以我们还是拆成 \(n\) 个点 但是表示他是倒数第几个修车的
然后边权就上面说的那玩意
然后跑最小费用最大流即可

posted @ 2023-08-15 21:29  Steven24  阅读(16)  评论(0)    收藏  举报