最近一直在讲图论,今天讲了网络流,题目注定不好写(代码巨长)。。。
昨天下午打多校,导致做题拖了很多进度,到昨天晚上才做4道。。。
尽管网络流的知识本身很难,比如说Dinic算法和费用流的算法到现在也没有完全搞明白,不过并不要紧,暂时把它看成一个黑盒吧
(窝太弱了。。。)而重要的是如何建图。一旦能够建出合适的图,再套一下模板,这道题就迎刃而解了。
下面看几道例题:
--------------------------------------------------------------------------------------------------------------------------------------------
A题(poj1087)
首先得读懂题
n种插座各一个接在电源上,
m个用电器,每个用电器有一个插座类型,
k种转换器,可以将一种类型转换为另一种。每种转换器可以用无数个。
问最少有多少用电器不能用。(引用。。。)
可以从源点向每个插座连边,用电器向汇点连边(flow=1)。每个插座相对应的用电器连边(flow=1)。对于转换器s1,s2,连s2到s1的边(flow=INF)。跑一次最大流即可,这道题还有一个坑点就是字符串处理上。。。
B题(poj1459)
最大流裸题,建立一个超级源点和汇点即可。
蒟蒻的我最开始以为源点和汇点不能随便选,后来。。。
C题(poj2391)
先用floyd求出相邻两点最短距离,然后二分答案,判断是否可以在时间不超过mid的情况下完成移动。
建图的时候可以拆点,将一个点拆成入点和出点,看每次跑出的最大流和牛的数量作比较。
E题(poj2135)
费用流裸题
对于每条边,容量设为1,表示每条边只能走一次,费用设为路径长度。
新加入源点和汇点,源点到起点,终点到汇点容量2,费用0。(引用。。。)
H题(poj3422)
以前做过这道题的弱化版,方格取数。当时用的4维dp做的,扩展后用到了今天的费用流。
求取得最大的正数也就是最小的负数,那就先将值反过来。将点拆成入点和出点x1,x2。x1与x2连2条边,(1)费用为1权值,容量为1.(2)费用为0,容量为k-1。再讲每个点x2与右或下的入点y1连边,费用为0,容量为k。左上角连源点,右下角连汇点,跑费用流即可。
K题(hdu5859)
查了一下,这是某年区域赛的题。总体思路最短路(SPFA/Dj)+最小割==最大流。
这道题就不写了,网上很多博主说的很好(Orz)
--------------------------------------------------------------------------------------------------------------------------------------
总结一下就是,图建的出来,这道题就A了