图论

网络流

1.AGC031E

题意

在二维平面上,有 \(n\) 颗珠宝,第 \(i\) 颗珠宝在 \((x_i,y_i)\) 的位置,价值为 \(v_i\)

现在有一个盗贼想要偷这些珠宝。

现在给出 \(m\) 个限制约束偷的珠宝,约束有以下四种:

  • 横坐标小于等于 \(a_i\) 的珠宝最多偷 \(b_i\) 颗。
  • 横坐标大于等于 \(a_i\) 的珠宝最多偷 \(b_i\) 颗。
  • 纵坐标小于等于 \(a_i\) 的珠宝最多偷 \(b_i\) 颗。
  • 纵坐标大于等于 \(a_i\) 的珠宝最多偷 \(b_i\) 颗。

现在问你在满足这些约束的条件下,盗贼偷的珠宝的最大价值和是多少。

  • $1\leq N\leq80 $
  • $1\leq x_i,y_i\leq100 $
  • \(1\leq M\leq320\)
题解

限制很复杂,看起来无法贪心,可以想到网络流。

用这四种限制直接建模会发现无法将限制体现出来。

考虑将限制转化一下,以第一个为例,可以理解为横坐标从小到大排序后偷的第 \(b_i + 1\) 颗的横坐标大于 \(a_i\),另外三个条件同理。现在还是存在四个限制,网络流不好处理。注意到 \(N\) 非常小,可以枚举偷的个数 \(k\),将横坐标和纵坐标的限制分别统一。现在只剩两个限制:

  • 横坐标排序后选的第 \(i\) 个点横坐标在 \([lx_i,rx_i]\) 内。
  • 纵坐标排序后选的第 \(i\) 个点纵坐标在 \([ly_i,ry_i]\) 内。

此时建模,将原本的 \(N\) 个点拆点以限制只能偷一次和赋权值,左边加 \(k\) 个点表示横坐标排序后的第 \(i\) 个选择,右边加 \(k\) 个点表示纵坐标排序后的第 \(i\) 个选择,向满足上面的两种限制的中间的点连边。左右再分别和源汇点连起来。

  • 左边的第 \(i\) 个点和右边的第 \(i\) 个点并不是同一个点,只是分别代表中间选择的点在关于横纵坐标排序后的排名。
  • 不需要考虑新加的 \(k\) 个点中第 \(i\) 个点和第 \(i+1\) 个点选择的坐标大小关系,因为如果第 \(i\) 个点选择的横坐标比第 \(i+1\) 个点大,那么将选择的两个点交换后依然满足条件,故并没有多出新的情况。

最后这两条在自己看题解的时候想了好久。。。

2.CF1416F

题意

对于大小为 \(n\cdot m\) 的矩阵 \(A\)\(B\),其中 \(A\) 的每个元素为一个权值 \(w(i,j)\)\(B\) 的每个元素为一个方向 L/R/D/U

初始你在 \((i,j)\),若 \(B_{i,j}=L\),你可以走到 \((i,j-1)\) 处,依次类推。

定义 \(S_{i,j}\) 表示从 \((i,j)\) 出发能够到达的点的 \(A_{i,j}\) 的和。

给定矩阵 \(S\),构造 \(A\)\(B\) 使得其生成的矩阵为 \(S\)

\(A\) 的每个元素均为正整数。

\(1\le n\cdot m\le10^5,S_{i,j}\in[2,10^9]\)

题解

考虑 \(A\)\(B\) 结合建成的图长什么样,应该是一个内向基环树。黑白染色可以看出图是二分图,故环为偶环,且环上的 \(S\) 全部相同。假设环上的 \(S\) 值为 \(s\),那么可以将环拆成若干权值和为 \(s\) 的二元环依旧合法。

现在考虑每个点的 \(S\),对于一个点 \(u\) 的出边只能指向 \(S_v\le S_u\) 的点 \(v\),故有:

  • 如果一个点 \(u\) 周围(四连通)没有 \(v\) 使 \(S_v\le S_u\),那么无解。
  • 如果一个点 \(u\) 周围存在 \(v\) 满足 \(S_v<S_u\),那么 \(u\) 可以连向 \(v\)\(A_u=S_u-S_v\)
  • 如果一个点 \(u\) 周围的点 \(v\) 都满足 \(S_u=S_v\),那么点 \(u\) 必在环内。

所以现在有一些必须在环上的点(后称必环点),需要和相邻点匹配成二元环。

考虑将图黑白染色,将黑色的必环点和相邻且 \(S\) 相等的白点连边,跑二分图匹配。如果有黑色必环点没有匹配上则无解。对白色必环点也跑一遍。跑完后按照匹配连边,会连出一些链和偶环。

对于偶环,拆成二元环。对于链,从头开始两两组成二元环,若是奇环会多出一个点,但是没有出度故不是必环点不用管。

  • 关于二分图匹配后的连边,是根据黑必环点根据第一个匹配向白点连单向边,白必环点同理。

最后一点我看的题解没有说清楚。

3.UOJ389

题意

平面上有 \(n\) 个点(有坐标),以及 \(m\) 条边,请走一个欧拉回路使得绕原点的圈数最大。

题解

第一步肯定是判断是否有欧拉回路,要满足两个条件:

  • 每个点度数为偶数。
  • 每条边和 \(1\) 连通(有孤立点是合法的)。

考虑绕原点圈数的转化,从原点向右引一条射线,圈数为向上穿过射线的边数和向下穿过射线的边数之差。于是可以给定向后的每条边赋一个权值,穿过射线的为 \(-1\)\(1\),其他为 \(0\),求最大权值。

考虑先构造出一种方案再进行调整,假设所有穿过射线的边权值都取 \(1\),此时可能会不合法(\(indeg\ne outdeg\)),需要进行调整。设 \(d_u=indeg_u-outdeg_u\)\(d_u<0\) 的点 \(u\) 需要反转 \(-d_u\) 条出边,\(d_u>0\) 的点 \(u\) 需要反转 \(d_u\) 条入边。可以这么建图:左边一列 \(d<0\) 的点,右边一列 \(d>0\) 的点,左右按照原图上可能被反转的边连接,两边加上源汇点就是费用流。

4.P3227

题意

有若干变量 \(a_{i,j}\),对于 \(|i−i'|+|j−j'|=1\),要求 \(|a_{i,j}−a_{i',j'}|\le D\),最小化 \(\sum_{i,j}f_{i,j,a_{i,j}}\)

\(N\le40\)

题解

考虑网络流建模跑最小割:

  • 每个 \((i,j)\) 都从 \(s\)\(t\) 连一条链,中间除和 \(s\)\(t\) 相连的边都表示一种 \(a_{i,j}\) 的选择,容量为 \(f_{i,j,a_{i,j}}\)。这样就表示每个 \((i,j)\),都要选一个 \(f\) 的取值。
  • 将限制的影响加入,设 \(x=a_{i,j},y=a_{i',j'}\),满足 \(|i−i'|+|j−j'|=1\),故 \(|x-y|\le D\),可以拆分为 \(x-y\le D,y-x\le D\)。拿前者举例,对于每一个 \(x\) 的取值,从其对应的边的起点向 \(y=x-D\) 对应的边的起点点连一条有向边容量为 \(+\infty\)(这样如果要使 \(y<x-D\) 就必须割掉新加的边或在割一条 \(x\)\(y\) 的链上的边,前者肯定不优,如果是后者那大可将链上原本的割边去掉)。

以一个难点在想到用最小割解决,第二个难点在加入限制,这是一个最小割建图的常用技巧,需要理解记忆。

5.CF1383F

题意

给定一张由 \(n\) 个点 \(m\) 条边组成的无向图,其中有 \(k\) 条特殊边,并在此后的 \(q\) 次查询中,每次给定 \(k\) 条特殊边的权值,且要求计算这个状态下的最大流。

\(n,m\le10^4,q\le2\times10^5,k\le10\)

题解

转化成最小割来做,\(k\) 条特殊边有 \(2^k\) 种情况(每条边割和不割),考虑每次询问都枚举每种情况对应的最小割并取 \(\min\),复杂度就已经到达 \(O(q2^k)\),不能再多了,剩下的就得预处理。

由于其他边的割法只和特殊边的割法有关而和特殊边的权值无关,预处理时可以强制钦定特殊边的割法,强制割就让权值为 \(0\)(不割白不割),强制不割就让权值为 \(+\infty\)

预处理的具体方法是,设当前要求不割 \(S\) 的答案,可以由 \(S\) 去掉最低位的答案的残余网络上修改边权后跑一遍 FF 得到(\(S=\varnothing\) 的答案最开始跑一遍 Dinic 求得)

最大流算法要灵活使用,比如这道题容量很小,改动也很小,跑 FF 就会比 Dinic 要好。

posted @ 2024-01-10 18:51  牛肉爱吃dks  阅读(5)  评论(0编辑  收藏  举报