网络流
网络流建模总结。
前置知识
网络流,费用流。
一,简单点的
1,二分图相关问题
设 $|X|+|Y|=n$
二分图最大匹配:$(S,x_i,1),(x_i,y_j,1),(y_j,T,1)$,设答案为 $t$。
最大独立集:$n-t$
2,多源多汇
直接新建超级源汇即可。
3,节点容量
直接拆点即可。
4,最小路径覆盖
前提:DAG。
对于每个点拆点,二分图中一条增广路径代表DAG上一条路径。
跑最大匹配,Y集合中若某个点不存在一个匹配则为一条路径的起点。
因此答案即为 $n$ - 最大匹配数。
二,不那么简单的
1,无源汇有上下界可行流
首先每条边必须得跑下界。
然后考虑一个附加流,每条的边权为上界与下界的差。
每条边最终的流量=网络流中反向边权值+下界。
对于每个点必须满足流量平衡,设 $d_u$ 为入边下界之和-出边下界之和,若 $d_u>0$ 则表明需要流多一点,$d_u<0$ 则表明可以流少一点。
因此新建超级源汇,若 $d_u<0$,则连边 $(u,t,-d_u)$,否则连边 $(s,u,d_u)$。当且仅当源点的出边满流时有解。
2,有源汇有上下界可行流
加入一条下界为 $0$,上界为 $\infty$ 的从 $t$ 到 $s$ 的边,变成上面的做法。
3,有源汇有上下界最大或最小流
先按照 1,2 的方法处理。然后删掉 1,2 中新加的边,在残量网络中跑最大流,两次答案相加即为答案。
最小流的话就把源汇反过来跑最大流就好了。
费用流同理。
4,最大权闭合子图
有向无环图,选了某个节点 $i$,则 $i$ 的后继必须选。问一种选择的方案使得选了的节点权值和最大。
假设先全部选了正的,然后最小割建图,$s$ 连节点权值为正的点,$t$ 连节点权值为负的点,减去最小割的答案即可。
三,比较难的
1,混合图的欧拉回路判定
混合图:既有有向,又有无向边的图。
欧拉回路:每条边只能且必须经过一次,最终回到起点的路径。
首先随便给无向边定向。
然后设 $d_i=出度-入度$,每给一个无向边反向都会使得某个点的 $d$ 减二,某个点的 $d$ 加二。因此若 $d_i$ 为奇数则一定无解。
若所有 $d_i$ 均为偶数,则将原图的无向边建边,容量为 $1$。然后新建源汇,容量为 $|\frac{d_i}{2}|$ 即可。
2,混合图的欧拉路径判定
若这没有 $d_i$ 为奇数的点,转成 1。
若有且只有两个 $d_i$ 为奇数的点,且一个为整,一个为负。则连一条边,变成 1。
其他情况无解。
3,最大密度子图
每个边有边权,点有点权,要去选出一个子图,使得 $\frac{\sum_{i\in E}e_i}{\sum_{i\in V} v_i}$ 最大。
显然0/1分数规划,二分答案 $mid$,有:$\frac{\sum_{i\in E}e_i}{\sum_{i\in V} v_i}\geq mid$,即 $e-mid\times v\geq 0$。
一条边选了,则它的两个点都必须选。
十分像最大权闭合子图的形式!
对于原图的每条边看做一个点,做最大权闭合子图即可判断 $mid$ 是否合法。