在久远的2010年,湖南省队集训的时候出了一道题叫c国,其本质是求平面图的最小割
//平面图,可以画在平面上边不相交的图
但是由于题目规模太大,一般的网络流都是过不了的……
但是当时雅礼机子太好,以至于dinic什么的写得好的有人可以水过
这种平面图网络流其实是有更优秀的算法可以解决的,将网络流转化为最短路
当时讲了这种算法,但是CNX先輩木有写,
NOI2010又出了一道几乎一模一样的题(altitude),CNX当时就瞎了……
下面写一下平面图网络流->最短路
首先对于平面图G,可以找到它的对偶图G*
G*中的每个点对应G中的面
然后对于G中的每条边,都会“挨着”两个面,这两个面对应着G*中的两个点,那么对这两个点连一条边
有一种情况是G中的边只挨着“外面”,那么连一条自环
这里有个图比较形象
然后发现,G*中的环对应着G中的割
这个性质如何应用在网络流上呢
在网络流的图G中,加一条边连接s,t
然后对这个图求其对偶图G*
去掉加的那条边 //实际上就是相当于没加
那么一条s到t的路径就是一个网络的一个割
我们把边加上边权,因为G*中的边与G中的边一一对应,边权就是对应的网络中的边的流量
然后对G*求最短路,那么得到G的最小割
最大流=最小割,因此不管问题是求网络流还是求最小割,都能够得解
有个问题就是平面图的面是很不好判断的
因此如果题目不给网格图几乎没法做,除了只适用于平面图,这也是这种算法难以推广的原因之一
然后实现的时候有建图和不建图两种,目测不建图一般比建图快
不管建不建图,想的时候都有点烦躁……