网络流这东西其实就是建模,对于算法本身需要深度理解它的基础模型,即对货物的来回传递,还要求掌握算法每一步的效果和作用(其实对每一个算法都是如此),我记录博客主要是为了防止自己忘记。
昨天学长出了一道题,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,所以只有可能流向一个试题库,而你最后一次记录的前向点,必然是它,那么有没有可能该前向点又走去别的试题库呢,那么必然需要从该试题库流回去,而保证让试题库流回去的前提条件是有一个点流入该试题库,此时前向点更新为该点,保证答案