网络流题目选讲

重要性质

  • 最大流=最小割

最大流

P6054 [RC-02] 开门大吉

我们可以轻松算出每个人选择一套题的期望得分

考虑最小割,割掉一条边\((u,i)\to(u,i+1)\)表示\(u\)选择了第\(i\)套题,流量为选择该题的期望得分

现在考虑要满足一些限制\(i,j,k\)

如果\(j\)做第\(p\)套,\(i\)必须做第\(\ge p+k\)的一套题,也就是必须在\(\ge p+k\)的地方割掉一条边,连边\((j,p)\to (i,p+k)\)

但是这样还有问题,因为一条链可能被割两次。这时需要对\((u,i)\to(u,i+1)\)连反向边,流量为\(inf\),保证一条链不被割两次

P1646 [国家集训队]happiness

转化问题,总和减去不满足的,不满足的要最小,也就是最小割。

对于每个人,源点连自己,流量为选文科的喜悦值,割掉它表示不选文科,理科同理。

对于多个人的限制:

  • 对于文科:新建一个点,源点连这个点,流量为选文科的喜悦值,然后这个点再连被限制的点,流量为\(inf\),也就是如果要不选文科,那么同时选文也必须被断掉
  • 对于理科:新建一个点,这个点连汇点,流量为选理科的喜悦值,然后被限制的点再连这个点,流量为\(inf\),意思同上

跑最小割即可

P4313 文理分科

同上,不写了

P5458 [BJOI2016]水晶

考虑最小割

观察这个神奇的坐标系的性质:\((x-z,y-z)\)相同的点与\((x,y,z)\)一一对应

然后三角形和直线型是有共同点的,三个点\(x+y+z\bmod 3\)分别为\(1,2,3\)

注意直线型中间的那么必须余数为\(0\)

拆点,出入点之间流量为\(c_i\),代表割掉的花费

CF724E Goods transportation

最大流做法显然,但是也显然过不了

考虑把最大流转换成最小割

\(f_{i,j}\)表示前\(i\)个点里,有\(j\)个与源点相邻的最小割

  • 如果当前点断掉与源点的边,那么上面的与源点相连的点,可以有\(c\)的流量留到当前点,然后\(s_i\)的流量再流到汇点。那么这些\(c\)的点必须断掉。\(f_{i,j}=f_{i-1,j}+p_i+c\times j\)
  • 如果当前点断掉与汇点的边,\(f_{i,j}=f_{i-1,j-1}+s_i\)

二者取\(\min​\),滚动数组即可

P3227 [HNOI2013]切糕

考虑最小割

每一个纵轴都必须选且只选一个,且选一个点会有代价。\((x,y,z)\to (x,y,z+1)\),流量为\(v(x,y,z)\),割掉这条边表示这个纵轴选择了\((x,y,z)\)\(s\to (x,y,1),(x,y,R+1)\to t\),流量为\(inf\)

对于两个相邻的纵轴,需要选的点的高度之差\(\le d\),也就是我们需要把不合法的连上。连\((x,y,d)\to (nx,ny,d-k),(nx,ny,d+k)\to (x,y,d)\),流量为\(inf\)

费用流

CF277E Binary Tree on Plane

拆点,源点连入点,流量为\(2\),表示最多\(2\)个儿子。入点连别的点的出点,流量为\(1\),费用为\(dist\)。出点连汇点,流量为\(1\),表示一个父亲

P4553 80人环游世界

这里有两种不同的构图方式:

第一种

类似CF277E Binary Tree on Plane,拆点,源点连出点,入点连汇点,流量均为人数。出点连汇点,流量\(inf\),花费为机票

但是这样无法限制人数,而且不能只到一个地方。再建一个新源点限制\(m\)个人,连入点,表示这些人在这个点结束

第二种

为了限制人数,在每个点的入点和出点之间连容量\(V_i\),费用\(-inf\)的边。最后再把这些inf加回去。

然后同样的再来一个源点限制人数

P4066 [SHOI2003]吃豆豆

首先拆点,入点连出点,流量\(1\),费用\(1\)。然后每个点对合法点连边。但是这样边数太大,需要优化。

注意到\(u\to v\)\(v\to w\),那么\(u\to w\)就不用连边了。这样可以减少边数。

还有一点:入点和出点之间还要有一条费用为\(0\)的边,表示两个都可以经过但是不能重复取

最大费用最大流即可

P2053 [SCOI2007]修车

考虑一个维修序列\(a_1,a_2,a_3,\cdots,a_n\)的总时间为\(na_1+(n-1)a_2+\cdots a_n\)

对技术人员\(u\)拆点,第\(i\)个点表示倒数第\(i\)个修一辆车\(x\),那么对总时间的贡献\(i\times T_{x,u}\)

最小费用最大流即可

P2050 [NOI2012] 美食节

上一题的数据加强版

我们可以发现有很多边实际上是不会用到的,凭增SPFA复杂度

我们考虑动态建边,只对有可能对当前状态造成影响的点建边。第\(u\)个人完成了倒数\(x\)个菜品,下一个只能是第\(x+1\)个,所以只把与\(u\)做倒数第\(x+1\)个菜品这个节点有关的边建出来跑SPFA

SPFA每增广一次后加一个点即可

P3980 [NOI2008] 志愿者招募

这是一个线性规划问题

设第\(i\)天需要的人数为\(p_i\)\(x_i\)表示第\(i\)种志愿者选择的人数,可以列出不等式(以样例为例)

\[\begin{cases} x_1\ge 2\\ x_1+x_2\ge 3\\ x_3\ge 4\\ \end{cases} \]

将大于等于的条件转化为\(=\),在每一天加上一个\(y_i\),表示多选了\(y_i\)个人

\[\begin{cases} p_1=x_1+y_1=2\\ p_2=x_1+x_2-y_2=3\\ p_3=x_3-y_3=4\\ \end{cases} \]

因为涉及到区间加,差分之后转化为

\[\begin{cases} p_1=x_1+y_1=2\\ p_2-p_1=x_1-y_2-y_1=1\\ p_3-p_2=x_3-x_1-x_2-y_3+y_2=1\\ -p_3=-x_3+y_3=-4 \end{cases} \]

将每一个等式作为一个点建图,按照符号为正表示流入,符号为符表示流出连边

  • \(p_{i+1}-p_{i}>0\)\(i\)连源点,否则连汇点,流量为\(|p_{i+1}-p_{i}|\),费用为\(0\)
  • \(i+1\)\(i\)连边,流量为\(inf\),费用为\(0\),表示\(y\)
  • \(s_i\)\(t_i+1\)连边,流量为\(inf\),费用为\(v_i\),表示\(x\)

最小费用最大流即可

最大权闭合子图

定义

闭合子图:一个点集,若\(u\)在这个点集内,那么所有\(u\)能到达的点也必须在这个点集内

最大权闭合子图:点权最大的闭合子图

求法

考虑最小割

对于原图中的点之间的边,连流量为\(inf\)的边。源点连向点权为正的点,流量为点权;点权为负的点连汇点,流量为\(-\)点权。

答案为 所有正点权之和\(-\)最小割

P2805 [NOI2009] 植物大战僵尸

首先可以按照保护与被保护的关系+位置关系建出有向图,保护点连向被保护点,右边的点连向左边的点。即对于边\((u,v)\)\(u\)被攻破之后才可以攻击\(v\)

拓扑排序去除这张图里的环

剩下的点将原来的边反向,\((u,v)\)表示如果要攻击\(u\)则必须攻击\(v\)。跑最大权闭合子图即可

posted @ 2021-06-10 19:01  harryzhr  阅读(68)  评论(0编辑  收藏  举报