网络流习题

网络流这东西其实就是建模,对于算法本身需要深度理解它的基础模型,即对货物的来回传递,还要求掌握算法每一步的效果和作用(其实对每一个算法都是如此),我记录博客主要是为了防止自己忘记。

昨天学长出了一道题,1e5对10的二分图,1e5的人分配在10个星球上,实际上加边优化跑dinic可以过,但是有一种更优的算法,因为每个人最多只有2^10种状态,那么可以把人压缩为2^10个点,跑dinic更快。

魔术球问题https://www.luogu.org/problem/P2763,我觉得这题挺tm毒瘤的,根本不适合入门,不建议新手做这种非模板的题目,转换有一定的难度,其实就是对数字枚举,每次加一个数,看看经过边调整能不能给它安上去,

很明显是个二分图,把入和出分开来,分别代表向后面连一个点,接入前面的点,当他无法被接入时显然需要独立门户,此时对应dinic算法中ans++,over~

试题库问题https://www.luogu.org/problem/P2763,这道题二分就比较明显了,一一对应就行,然后需要对dinic算法有理解才可以最后输出正确的答案,适合入门。

记录答案方法还是蛮多的,看你自己的理解程度吧,列举几个:

1.建立试题库的时候记录一下建立反向边的范围,最后从试题库的点开始跑nxt链表,反向边流量大于0就表示走过。

2.在dfs的时候记录一下前向点,我们仅看试题库那几个点,显然记录的前向点是连向他们的点,而连向他们的点只有可能是t或者试题,而dfs保证走到t就停止,所以所有的前向点全部是试题,而且既然是试题,就必然保证该试题只会走向该试题库,因为每个试题和s的流量是1,所以只有可能流向一个试题库,而你最后一次记录的前向点,必然是它,那么有没有可能该前向点又走去别的试题库呢,那么必然需要从该试题库流回去,而保证让试题库流回去的前提条件是有一个点流入该试题库,此时前向点更新为该点,保证答案的正确性,当时我就是这么做的,但是没有想这么多。

3.看每个试题的链出点,因为试题的链出点只有s和试题库的点, 稍做判断即可。

餐巾计划问题https://www.luogu.org/problem/P1251,明显的二分图模型,但是在建造上需要多花费一些脑筋,要在自己的脑袋里面试想一下真实的情况,跑一个最小费用最大流即可。

关于怎么建图其实没什么好说的,看看代码,多学习一下就有这种感觉了。

就是几个模型,相似模型的转化,没啥好说的。

最长不下降子序列https://www.luogu.org/problem/P2766,问能拿出多少个最长长度的子序列,思路也比较好想,对每一个点进行流量限制,s和t分别对d最小和最大连点,节点流量限制的题目,然后利用网络流的优势尽可能跑最多的流,取最多的序列。

好像还需要特判一下长度为2的,记不清楚了。

教辅的组成https://www.luogu.org/problem/P1231,这道题有点意思,还有一道相似题,这里说这道相似题目吧,酒店之王https://www.luogu.org/problem/P1402,感觉模型很简单,但是还是有坑点的,必须要把人放在中间作为点,可以试想试一下,如果把酒店作为中间点的话,有可能产生一种情况,就是酒店和菜相互连点,不受人的限制,那么有可能酒店1和菜a对A匹配,酒店1和菜b对B匹配,此时没有菜b和A,有酒店1和菜a和B,那么他们就会匹配成功,这显然是不正确的,在大数据下,这种情况非常的多。

而人作为中间点就没有这种情况,不会少任何一条边或者条件。

方格取数问题https://www.luogu.org/problem/P2774,最小切的问题,其实蛮不好理解的,不能取相邻的点,那么整个图就可以二分,具体做法略。

这其实就要谈到最小割的问题了,最小割就是把所有的值分为几组,组内之间可以同时取值,组之间的一些点会产生限制,也就是说我们的最终结果可能包含多个组里面的值,但是一定不会包含组之间相互限制的点,对于相互限制的点而言,我们跑最大流的时候已经最优化处理掉所有限制的条件前提下整体的最优解。

其实题目的限制体现在组之间的连线容量之上。

对于本题,我们处理完最大流最小割之后的残余网络就是我们要选取的点,如果该点有残余流量即表示该点在全局下最优,统计处理即可。

未完待续

 

 

你可能感兴趣的:(网络流)