做了一段时间的网络流,发现只会刷水,稍难的都不会。。。
水题就不放出来了,放一些模型和有趣的题吧
经典模型:
BZOJ1070: 每个人拆成若干个点,每辆车和拆出的第i个点连就代表他是这个人倒数第i辆修的车,对答案贡献i*c
BZOJ1532: 二分最大流
BZOJ1565: 最大权闭合子图:即点有依赖关系,对于一条边
(u,v)
,选了点
u
必须点
BZOJ1927:因为出入度确定,点拆成一个出度点一个入度点,原图里的边在出入度里照连,源连向每个入度瞬移的费用
有趣的题目:
bzoj2597
石头剪刀布的情况好像没法算捏,考虑三个人猜拳除了石头剪刀布的情况,其他情况都是一人赢两次,一人赢一次输一次,一人输两次的情况,考虑让这种情况最小化。
用赢两次的那个人统计这种情况,一个人身上的情况是出度×(出度-1)/2,每场比赛一个点,连向相关的两人容量为1,每个人连汇点n条边代表赢i次增加的情况,如果本身已经有i的出度,1~i条边都不用建,所有情况数减费用流结果就是最多的情况,输出方案扫一下边
codechef Annual Parade: 传送门
首先一个城市经过多次意义只是为了到达其他城市,所以Floyd后转化成每个城市只去一次,唯一前驱后继,每个点拆出入度连边,费用流。因为我们一次费用流就是增广一条路径,到达一个点,假设这次增广费用是V,如果
V<C
,那么这次增广就可以对答案产生贡献,那么预处理出所有增广,将询问按C排序扫一遍就可以了
codechef Game of Numbers:传送门
每个数对只能用一次,
a[i]<b[j]
和
a[q]>b[p]
匹配,求最大匹配数,可以很容易先想到左边为
a[i]<b[j]
,右边
a[q]>b[p]
的最大流,至于GCD的限制,将GCD分解质因数,质因数放中间连就行了
codechef Course Selection:传送门
最小割
主要是一个课程的前驱要在他之前学很难限制
将每个课程拆成m+1个点,源和第1个点连inf,然后每个点和他后一个点连容量为
100−
这一学期学的分数,x课程如果是y课程的前驱,那对于x课程的任意第i个点,向y课程第i+1个点连边,n*100-最小割
网络流的题很多要拆点拆边什么的,要注意一些模型
最大流的题一般不会太难,有时加个总和减最大流,二分什么的
费用流挺多要拆边的
最小割的很多都是一个点连源汇代表选还是不选,解个方程,用总和减最小割就是最大值
不知道说什么就这样吧