【ACM小思】一道魔改费用流引发的思考
魔改费用流一道
有n个城市,p条双向道路把这些城市连接起来,一对城市之间可能有多条道路连接。FJ要找到t条从城市1到城市n的路径,不同的路径不能包含相同的道路。在这一前提条件下,FJ希望所有路径中经过的最长的道路最短。
乍一看是一个网络流的问题
路径不能重复,那就把边的容量当做1,最后求汇点流量为t的情况,增广的过程其实就是找路的过程。
但问题是怎么求出最短的最长边权?一种朴素的想法是二分答案,让所有边权超出要求的边断流,然后验证条件就是最大流是否大于t。
已经是个不错的算法了。
但是,我们还可以做得更好!
还记得费用流是怎么做的吗?从源到汇不断找最短路,找到一次增广一次。而最短路的性质是“找出路径上所有边权的和”,但是我们这里想要的是保证这两个点之间的最大边权最短。
最小生成树?
对,实际上无论是最短路和最小生成树,都是求出“满足特定性质的路径”的一种方法。
那我们不妨把最小费用流改一改?就像我们之前对最短路做的拓展思考一样。
正解,就是如此。