重要性质
- 最大流=最小割
最大流
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)种志愿者选择的人数,可以列出不等式(以样例为例)
将大于等于的条件转化为(=),在每一天加上一个(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)。跑最大权闭合子图即可