网络流题目选讲
重要性质
- 最大流=最小割
最大流
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\)种志愿者选择的人数,可以列出不等式(以样例为例)
将大于等于的条件转化为\(=\),在每一天加上一个\(y_i\),表示多选了\(y_i\)个人
因为涉及到区间加,差分之后转化为
将每一个等式作为一个点建图,按照符号为正表示流入,符号为符表示流出连边
- 若\(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\)。跑最大权闭合子图即可