费用流初识

费用流初识


费用流
对于f < fmax的费用流,可以把T拆成两个点,转化成最小费用最大流

最小费用最大流
流量最大时费用最小,求最大费只需把值取反就行

消圈算法:
可行流x为最小费用流的充要条件是残量网络中不存在负费用增广圈
(我还没写过)

连续最短路径算法:
可证明每次增广后没有负费用圈
可用spfa,或者定义新的权值函数,使不存在负权,于是就可以用dijkstra
如果每条边的费用为0,就相当于EK算法
目前见到的题一般都可以用spfa解决,也许等学了网络流的算法后再写个zkw算法

PKU 2516
模板题
求k次费用流

SPOJ 371 - Boxes(简单)
虽然被称为是简单题,但我觉得构图还是挺经典的
以每个盒子中的球数作为结点到汇这条边上的容量
对于相邻两个结点u和v,分别(u, v, n),(v, u, 0),(v, u, n),(u, v, 0)

BUPT 1746
点不相交的最短路径个数
拆点,限制容量为1,每次SPFA增广后的费用如果等于第一次的,ans++

PKU 2135
连一条S到1的容量为2花费为0的边

POI2006 Szk-Schools
二分图带权匹配,也可以用KM 

HDU 3395
二分图带权匹配,但要注意,并不要求是最大匹配,即最大费用不对应着最大流 
解决的方法是转化为最大匹配,即把二分图的左边各点都连一条容量1,费用0的边到T

ZJU 3308
基本的费用流

PKU 2175 - Evacuation Plan(中等)
如果最小费用比题目给出的更优,则输出一组解

PKU 3422 - Kaka's Matrix Travels(中等)
构图要求每个点权只被计算一次,且被计算过的点不影响图的连通性
a->b拆成a->a',b->b',a->b,a'->b,其中a->a'与b->b'为流量1,费用为wa,wb的边,另两条为流量k,费用0的边;
也可以把a->b改成a->a'流量为k,费用为0的边
s->(0,0)点连一条流量为k,费用为0的边

PKU 3762 
可以想到类似PKU 3422的建图,从Roba那里看到更好的建图方法,
关键在于时间是满足一个线性序的,利用这个条件可以不需要拆点
把所有的时间点排序(离散化),相邻的点连一条容量为k,费用为0的边,对于给定的区间,连一条容量为1,费用为-w的边

PKU 3680 - Intervals
相当于是一次可以选择若干不相交的区间,一共可以选择k次
有了PKU 3762的经验,这题的建图是一样的

HDU 1853
Roba出的题
可转化为:每条边选或不选,使得每个点的出度等于入度等于1
把一个点拆成4个点,a:a1,a2,a3,a4,a1->a2限制出度为1,a3->a4限制入度为1,若存在e(a, b, w)
则连一条a2->b3的边,边权为w

FZU 1940
2010 ACM-ICPC Multi-University Training Contest(1)--Host by FZU 
同HDU 1853,把无向边改成两条有向边

HIT 2885 Gold Mines
http://acm.hit.edu.cn/judge/show.php?Proid=2885
2009 ACM/ICPC Asia Regional Harbin Site Onsite
点和边都最多选一次,且点有配对关系
所谓退一步海阔天空,一开始想枚举确定所有的配对关系,但这样构造不出图来,
其实只要确定每组的1个就可以了

4271 - Necklace
http://acmicpc-live-archive.uva.es/nuevoportal/data/problem.php?p=4271
点不需要完全覆盖,实际上是找两条边不相交的路径
用网络流可以做,费用流也可以,都相当与找出最短路和次短路

*SGU 185 - Two shortest
http://acm.sgu.ru/problem.php?contest=0&problem=185
限制边的容量是1,无向边拆成两条有向边
需要找到2条增广路后再根据边的容量找出路径
可是为什么WA了呢?!

SGU 438. The Glorious Karlutka River =)(网络流)
http://acm.sgu.ru/problem.php?contest=0&problem=438
非常经典的一题,参见黑书P325 CTSC1999 家园
从小到大枚举时间,并对应地拆点,且每次新加的点是在原图的基础上,故可以在原图继续增广
如果二分的话每次需要重新建图

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值