把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

网络流在最优化问题中的应用

AGC013E Snuke the Phantom Thief

首先考虑只有 LD 的限制,这样是平凡的,只需要求出横坐标第 \(i\) 个点的值至少要多少,纵坐标至少要多少,然后将每个点拆点后向能连到的横坐标点和纵坐标点连边,然后跑最大费用最大流即可。

现在加上 RU 的限制,我们发现这个限制好像不知道加在哪些点上,只知道是倒数哪个点,这好办啊!枚举选的点数不就好了!

总复杂度 \(O(n^5)\) 但是显然跑不满就是了。

submission

[HNOI2013]切糕

最小割模型。

建立网络流模型,将每个纵轴看成 \(R+1\) 个点,这 \(R+1\) 个点形成的一条链中间的 \(R\) 条边对应了这 \(R\) 个点的权值。

我们定义割掉一条边代表选了这个点,那么我们就是要求相邻两个割点的边不能超过 \(D\)

相当于我们不能让 \(<i\) 被割且对面 \(>i+D\) 被割。因此我们让对面的 \(i+D\)\(i\) 连一条无穷边即可。

还要保证一条链最多割一条,但是貌似不需要。

submission

CF1630F Making It Bipartite

首先我们发现这个东西是偏序集,这很好啊,说明如果存在 \((a,b)(b,c)\) 那么一定存在 \((a,c)\)

一个图是二分图的充要条件是没有奇环,而上面显然有了一个。因此我们的目标就是让图中没有一个点既有入边又有出边。

因为是偏序集,所以考虑用最长反链相关来解决。将每个点 \(u\) 拆成两个点 \(u_1,u_2\),表示在最后的图上只有入度或者只有出度。显然这两个之间是矛盾的,因此可以 连边 \(u_1\to u_2\) 。对于原图存在的一条边 \((u,v)\) ,显然 \(u\)\(v\) 之间的关系除了 \(u\) 只有出边,\(v\) 只有入边之外都是矛盾的,因此连边 \(u_1\to v_1,u_1\to v_2,u_2\to v_2\) 即可。然后可以跑最小链覆盖。

时间复杂度是Dicnic的 \(O(A\ln A\sqrt n)\) 但是显然不满。

submission

[NOI2019] 序列

貌似是模拟费用流经典题,但是我没做过(

首先考虑建立费用流模型,大概就是首先对 \(S\to i\) 连边 \((1,a_i)\)\(i\to i+n\) 连边 \((\infty,0)\)\(i+n\to T\) 连边 \((1,a_i)\)

至少选 \(L\) 个相同位置不好做,转化成至多选 \(K-L\) 个不同位置,那么可以建立点 \(x,y\)\(x\to y\) 连边 \((K-L,0)\),然后每个 \((i,x)\) 连边 \((\infty,0)\) ,每个 \(y\to i+n\) 连边 \((\infty,0)\)。对这个图跑最大费用的 \(K\) 个流就是答案。

然后模拟最短路的过程。首先可以想到的方案是 \(S\to i\to i+n\to T\)\(S\to i\to x\to y\to j\to T\) 。这是不退流的最短路。

\(i\) 的匹配点为 \(p_i\),如果要退流还有以下三种:

  • \(S\to i\to x\to j\to j+n\to T\)。这对应于原图将原来的 \(j\to p_j\) 转化成 \(i\to p_j,j\to j+n\),发现这样是多了 \(a_i\)\(b_j\) ,且 \(x\to y\)的流量不变。
  • \(S\to i\to i+n\to y\to j+n\to T\)。容易发现这和上一种情况是对称的。
  • 第三种情况比较复杂,\(S\to i\to i+n\to y\to x\to j\to j+n\to T\),对应于原图就是将 \(i\to p_i\) 变成 \(i\to i+n,p_i-n\to p_i\)。也就是多了 \(b_i\)\(a_{p_i-n}\)
  • 单从图上来看貌似还有前两种拼在一起的情况,但是这样一次性增加了两个流量,且实际上就是先第一种,然后不退流的第二种。所以不用考虑。

因此我们可以用堆来维护五个值:

  • \(a_i+b_i\),满足 \(i\)\(i+n\) 都没有匹配。
  • \(a_i\),满足 \(i\) 没有匹配。
  • \(b_i\),满足 \(i+n\) 没有匹配。
  • \(a_i\),满足 \(i\) 没有匹配,且 \(i+n\)匹配了。
  • \(b_i\),满足 \(i+n\) 没有匹配,且 \(i\) 匹配了。

这五个值可以计算出上面五种情况的答案。但是这样不太对,因为上面五种情况最大值唯一还好说,如果不唯一,那么会有优先级的问题。

贪心地想,肯定是能任意匹配地对数越多越好,因此退流第三种显然优先级最高,然后是三种不影响任意匹配数地情况相等,最后要加一次的情况优先级最低。

这样你会得到一个大常数 \(O(n\log n)\) 做法,在 O2 加持下貌似跑得飞快。

submission

posted @ 2023-02-22 18:57  275307894a  阅读(79)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end