网络流题目选讲

重要性质

  • 最大流=最小割

最大流

P6054 [RC-02] 开门大吉

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

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

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

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

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

P1646 [国家集训队]happiness

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

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

对于多个人的限制:

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

跑最小割即可

P4313 文理分科

同上,不写了

P5458 [BJOI2016]水晶

考虑最小割

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

然后三角形和直线型是有共同点的,三个点(x+y+zmod 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 imes j)
  • 如果当前点断掉与汇点的边,(f_{i,j}=f_{i-1,j-1}+s_i)

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

P3227 [HNOI2013]切糕

考虑最小割

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

对于两个相邻的纵轴,需要选的点的高度之差(le d),也就是我们需要把不合法的连上。连((x,y,d) o (nx,ny,d-k),(nx,ny,d+k) o (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 o v)(v o w),那么(u o 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 imes T_{x,u})

最小费用最大流即可

P2050 [NOI2012] 美食节

上一题的数据加强版

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

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

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

P3980 [NOI2008] 志愿者招募

这是一个线性规划问题

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

[egin{cases} x_1ge 2\ x_1+x_2ge 3\ x_3ge 4\ end{cases} ]

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

[egin{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} ]

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

[egin{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)。跑最大权闭合子图即可

原文地址:https://www.cnblogs.com/harryzhr/p/14872406.html