网络流学习笔记
网络流学习笔记
最近几天都在学虽然不知道有什么用
但还是在这里做一个总结.
再立一些奇怪的flag
一.网络流的有关算法
1.最大流
主要是EK和Dinic.(什么ISAP,HLLP就没学了,卡Dinic的是毒瘤)
感觉EK没什么用啊,跑得慢.还是Dinic好,跑得快,还好理解.
我打Dinic一般就是多路增广+当前弧优化.
一遍bfs构出分层图,然后跑多路增广.
2.费用流
我只会EK费用流.
把EK中的bfs找随机一条增广路改成spfa找费用最小增广路即可.
3.应用
二分图.
虽然说网络流不一定要学二分图,但学了二分图将有助于网络流一些题目的理解.
二分图的最大匹配=最大流(吊打匈牙利)
二分图带权最大匹配=费用流(吊打KM)
二.一点套路
1.二分图多重匹配
这个很简单,改一下容量限制即可.有很多模板题
2.拆点
这个比较重要.
如果一个题目中一个元素有两种"身份"(这个在后面的题目会有说明),那么可以考虑将它的两个身份分别丢到二分图的左部图与右部图中,那么这个元素与其他元素之间的关系就可以用互相之间的连边来描绘.
三.题目
不多说了,网络流与线性规划24题是你的最佳选择.
1.飞行员:
二分图最大匹配模板.
2.负载平衡
拿贪心水的,网络流做法暂时没看.
3.软件补丁
不是网络流.
直接状压+最短路.
4.孤岛营救
没写,应该是状压+bfs
5.魔术球
对我而言第一道正式的网络流的题目.
思路是枚举放到第几个球,那么对于每一个新进来的球,有两种决策,放到前面或者新开一根柱子.
有一个贪心要想到,那就是能不开柱子就不开柱子.
那么如何跟网络流扯上关系呢?
继续之前的思路,来了个球,我可能把它放到之前的许多球上,使得他们的和为完全平方数.
但是我既不知道前面球的放置方案,也不清楚将当前球放到前面的球上会有什么影响.
只是知道它与前面的一些球有可能性相连.
既然跟图论有关,我们可以很自然地将这种可能关系转化为它们之间有一条连边(有向边,仅从小连到大),并且还要限制一个点在最终的决策中只与一个而不是多个点连边,因为每个球上面只会有一个球.
又由于我们连边是有顺序的,所以这张图是一个DAG.
那么一根柱子既体现为这个DAG上的一条链.
所以题目转化为在一个DAG上用固定条数的链在节点不重复的情况下最多能覆盖多少个点.
为了使问题简化,我们不妨考虑用最少链覆盖固定点数.
那么每一条这样的链,除了端点外,每个点都有一条入边与出边.
反正你就要想到这是可以拆点,用网络流的,那么每一个点都有两个身份,它既是入边的中点,也是出边的起点.
把这个点分别拆到左部图与右部图.左边的它会有若干条出边指向右部图的其他点,右边的它会被若干条来自左部图的点指向.
那么链最少意味着被选入链中的边尽可能的多,在二分图上则对应着左右两部图之间的连边尽可能的多.
又每个边只能选一次,所以就是二分图上的最大匹配了.
6.汽车加油行驶问题
没做.
7.圆桌问题
多重匹配...太板子了.
别把n,m看反/搞混就ok.
8.试题库
还是多重匹配板子
9.最小路径覆盖
在魔术球里面讲的很详细了,这里不多说.
10.分配问题
费用流板子.
(补坑)