poj_3281Dining(网络流+拆点)
poj_3281Dining(网络流+拆点) 标签: 网络流 题目链接 题意: 一头牛只吃特定的几种食物和特定的几种饮料,John手里每种食物和饮料都只有一个,问最多能够满足几头牛的需求(水和食物都必须和他们的胃口)。 题解: 网络流 建图:从源点向每个食物连一条边,容量为1, 将牛拆成两个点牛,牛',中间连边,容量为1 从食物向牛连边,容量为1 连牛'和饮料,容量为1 连饮料和汇点,容量为1 网络流三种算法的理解和代码实现以及相应的模板 先介绍一个定理: 最大流最小割定理: 割:去掉某几条边使得源点和汇点不再联通,那么这几条边就叫一个割,这几条边的边权和最小的就叫做最小割。 一个图的最大流就是这个图对应的最小割,可以看做是一个沙漏,最大流是要求这个沙漏每个时刻最大的流量,那就相当于是求沙漏最细的地方的流量。而最小割就相当于是用一个刀子将这个沙漏一分为二,然后找横截切面最小的就是这个沙漏最细的地方。 再介绍一些网络流的一些基本性质 流网络G的流(flow)是一个实值函数 f :V ×V → R,且满足下列三个性质 (1) 容量限制:对于∀u,v∈V ,要求 f (u,v) ≤ c(u,v)。 (2) 反对称性:对于∀u,v∈V ,要求 f (u,v) = −f (v,u)。 (3) 流守恒性:对于∀u,v∈V −{s,t},要求∑f (u,v) =0。 f(u,v)即为u到v的流