最大流3题
最大流的一个基本算法就是Ford-Fulkerson,基本的思路是:每次寻找一条增广路,记下增广路上最小的可改进量,并改进这条增广路,如此循环直到不存在增广路。
可以发现,Ford-Fulkerson有点浪费时间,SAP应用标号思想进行优化。另外对于单流增广,它必须找到一条完整的增广路之后再进行增广,如果存在一条岔路,那么它必须分作好几次才能做完。因此多流增广就有了:对于一个节点,在其可增广范围内对其相邻节点递归增广。
网络流的题目在构图的时候有个小技巧,原先需要使用剩余网络,必须有两张图存储。而实际应用中,只要每一条有向边都有一条跟它对应的反向边,且这两条边的流量值和等于容量限制即可。这样只要在一张图中存储即可,省去不少麻烦。自然,改进这条路的时候,将一条边上的流量+Delta,另一条边-Delta。
关于Ford-Fulkerson和SAP的基本思想可以参考附件的两个课件。下面贴出来几题最大流的题目,详细的Ford-Fulkerson和SAP实现见程序,可以参考注释。[PKU1273]Drainage Ditches
赤裸裸的网络流,下面的程序是Ford-Fulkerson算法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
|
[PKU1459]Power Network
这题需要简单的构图。从源点S连Np条边到发电站,接着用m条边连接发电站和客户,最后用Nc条边连接客户和源点。然后做一遍最大流即可。下面这题用单流SAP实现(建议看下一题的多流SAP,程序比这个简洁而且速度更快)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
|
[PKU1698]Alice’s Chance
首先是构图。由源S分别连接容量为d[i]的边到第i个电影。接着把几个MaxW个星期拆成MaxW7个点表示每一天,如果第i部电影可以在第x天拍摄的话,那么就连一条容量为1的边到x天。最后把MaxW7天分别连容量为1的边到汇点T。做一次最大流,如果最大流=Sum{d[i]},那么就Yes,否则No。 这题的程序是我最满意的,推荐看这题的程序。SAP写的是多流增广。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
|
总结
其实熟悉了算法后,最大流的题目难点转移到了构图上面。只要图构造出来了,SAP套进去答案就出来了。