网络流

基础知识

网上博客有很多,这里就没必要再赘述了。

贴一份 \(yxc\) 的笔记:1. 基本概念     1.1 流网络,不考虑反向边     1.2 可行流,不考虑反向边         1.2.1 两个条件:容量限制、流量守恒         1.2.2 可行流的流量指从源点流出的流量 - 流入源点的流量         1.2.3 最大流是指最大可行流     1.3 残留网络,考虑反向边,残留网络的可行流f'   原图的可行流f = 原题的另一个可行流         (1) |f'   f| = |f'|   |f|         (2) |f'| 可能是负数     1.4 增广路径     1.5 割         1.5.1 割的定义         1.5.2 割的容量,不考虑反向边,“最小割”是指容量最小的割。         1.5.3 割的流量,考虑反向边,f(S, T) <= c(S, T)         1.5.4 对于任意可行流f,任意割[S, T],|f| = f(S, T)         1.5.5 对于任意可行流f,任意割[S, T],|f| <= c(S, T)         1.5.6 最大流最小割定理             (1) 可以流f是最大流             (2) 可行流f的残留网络中不存在增广路             (3) 存在某个割[S, T],|f| = c(S, T)     1.6. 算法         1.6.1 EK O(nm^2)         1.6.2 Dinic O(n^2m)     1.7 应用         1.7.1 二分图             (1) 二分图匹配             (2) 二分图多重匹配         1.7.2 上下界网络流             (1) 无源汇上下界可行流             (2) 有源汇上下界最大流             (3) 有源汇上下界最小流         1.7.3 多源汇最大流

最大流

个人认为比较重要的几个点就是:

建的是原图的残留网络

每次增大就相当于减小残留网络中的容量。

分层思想

保证流的顺序。

当前弧优化

别的我不知道,我只知道如果没有它你会死翘翘。

详细分析也不讲啦,这里推荐一篇证明博客

费用流

费用流是基于网络流,只是多了一个费用的条件限制。

算法核心应该就是利用 \(spfa\) 可以处理负权的功能进行最短路。

注意点:

流量处理时要注意一定是“照顾弱小”。但是初始值为 \(inf\)。

利用链式前向星的特性记录路径就很妙。

建图总结

其实大家都可以发现,网络流难点在于建图,只要把图建对,走遍天下都不怕。

然而建图都是有规律可循的,所以总结一发。

一、常规建图(又名直接来)

现在一般都不会出现直接建图的情况了。。。

一共有 \(n\) 个飞行员,其中有 \(m\) 个外籍飞行员和 \((n - m)\) 个英国飞行员,外籍飞行员从 \(1\) 到 \(m\) 编号,英国飞行员从 \(m 1\) 到 \(n\) 编号。 对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。

\(Solution\):

直接将外籍飞行员和可以配合的英国飞行员连边, 每个外籍向源点,英籍向汇点连容量为1的边,以控制每人只能配对一次。

建图:for(rt i = 1; i <= m; i   ) add(s,i,1); for(rt i = m   1; i <= n; i   ) add(i,t,1); read(a), read(b); while(~a && ~b) { add(a,b,1); read(a),read(b); }

舞会

某学校要召开一个舞会。已知学校所有 \(n\) 名学生中,有些学生曾经互相跳过舞。当然跳过舞的学生一定是一个男生和一个女生。在这个舞会上,要求被邀请的学生中的任何一对男生和女生互相都不能跳过舞。求这个舞会最多能邀请多少个学生参加。

\(Solution\):

反向思考,题目要求最多邀请人数,其实就是求最小不邀请人数,那么就转化成了求所有相互跳过舞的人中的最小割。

注意,因为题目没有给定男女生的具体情况,所以要先做染色处理,确定男女生,不同性别连向不同端点,跳过舞的一对就直接连边即可。

二、拆点(网络流一大热点)

就不用介绍了吧。

主要是用来控制每个点的使用次数的。

FJ的奶牛们只吃各自喜欢的一些特定的食物和饮料,除此之外的其他食物和饮料一概不吃。某天FJ为奶牛们精心准备了一顿美妙的饭食,但在之前忘记检查奶牛们的菜单,这样显然是不能不能满足所有奶牛的要求。但是FJ又不愿意为此重新来做,所以他还是想让尽可能多的牛吃到他们喜欢的食品和饮料。FJ提供了F (编号为1、2、…、F)种食品并准备了D (编号为1、2、…、D)种饮料, 他的N头牛(编号为1、2、…、N)都已决定了是否愿意吃某种食物和喝某种饮料。FJ想给每一头牛一种食品和一种饮料,使得尽可能多的牛得到喜欢的食物和饮料。每一种食物和饮料只能由一头牛来用。例如如果食物2被一头牛吃掉了,没有别的牛能吃到食物2。

\(Solution\):

传统思路,将食物、牛、饮料按顺序建成网络流,但是因为控制了数量,所以将奶牛割成两个点,前一个点连源点,后一个点连汇点,两个点之间连容量为1的边,就能保证每头牛只消耗一份食物和饮料。

代码戳这里

三、分点(自定义)

其实我也不知道这个东东叫啥。

特点:利用题目给定的连边条件,将不同情况的点连向不同端点(感性理解一下)。

王者之剑

第一行给出数字N,M代表行列数.N,M均小于等于100,宝石的价值不会超过10000.下面N行M列用于描述数字矩阵

\(Solution\):

稍微观察就会发现,每个格点与他周围的四个格点的坐标和的奇偶性不同,说明相同奇偶性的格点不会相互排斥,也就是可以同时选。所以将不同奇偶性连向不同端点就好了。

如果坐标和为偶数(因为偶数与汇点相连),从当前点向周围四个点连边,边权为正无穷,意为连接的两个点不能同时选择。

代码戳这里

wyc的奇妙女友

wyc想出一道二分图(最大流),于是他找了女友们

单身多年的wyc终于找到了女朋友,而且一次性找到了\(inf\)个,wyc很喜欢她们里的所有人,但是害怕她们之间互相争斗导致自己后宫着火,wyc又十分喜欢挑战人类极限,想让一片街区有最多的女友可以让他肆意妄为,为了满足他的欲望,他找到了你来请你帮帮他。街区中的一个位置可以看做一个点。由于看上了wyc,wyc的女友们视野变得十分奇怪,她们只能看到目字型的位置,例如:如果她在点(5,5)上,她可以看到(6,8),(8,6)....(共八个)的点,如果wyc的一个女友看到了他的其他女友,那么她就会意识到wyc不仅有一个女友,wyc就会遭到迫害。现在wyc的女友们都在逛gai,已知街区大小为\(n*m\)(棋盘),其中有\(k\)个点没有wyc的女友,请问这条街区上最多可以有多少wyc的女友。

\(Solution\):

做题思维不能太固化,我拿到题就直接用坐标和建边,但是肯定是错的。观察图片,我们发现人所在的位置与她所能看见的位置的横、纵坐标的奇偶性各不相同,所以利用横或纵坐标来建边即可。

四、位置建边

其实就是将二维图转化成一维建图。

来源:https://www.icode9.com/content-4-823551.html

(0)

相关推荐