关于网络流和平面图

在久远的2010年,湖南省队集训的时候出了一道题叫c国,其本质是求平面图的最小割

//平面图,可以画在平面上边不相交的图

但是由于题目规模太大,一般的网络流都是过不了的……

但是当时雅礼机子太好,以至于dinic什么的写得好的有人可以水过

这种平面图网络流其实是有更优秀的算法可以解决的,将网络流转化为最短路

当时讲了这种算法,但是CNX先輩木有写,

NOI2010又出了一道几乎一模一样的题(altitude),CNX当时就瞎了……


下面写一下平面图网络流->最短路

首先对于平面图G,可以找到它的对偶图G*

G*中的每个点对应G中的面

然后对于G中的每条边,都会“挨着”两个面,这两个面对应着G*中的两个点,那么对这两个点连一条边

有一种情况是G中的边只挨着“外面”,那么连一条自环

这里有个图比较形象

关于网络流和平面图_第1张图片

然后发现,G*中的环对应着G中的割


这个性质如何应用在网络流上呢

在网络流的图G中,加一条边连接s,t

然后对这个图求其对偶图G*

去掉加的那条边 //实际上就是相当于没加

那么一条s到t的路径就是一个网络的一个割

关于网络流和平面图_第2张图片

我们把边加上边权,因为G*中的边与G中的边一一对应,边权就是对应的网络中的边的流量

然后对G*求最短路,那么得到G的最小割

最大流=最小割,因此不管问题是求网络流还是求最小割,都能够得解



有个问题就是平面图的面是很不好判断的

因此如果题目不给网格图几乎没法做,除了只适用于平面图,这也是这种算法难以推广的原因之一

然后实现的时候有建图和不建图两种,目测不建图一般比建图快

不管建不建图,想的时候都有点烦躁……

你可能感兴趣的:(c,算法,网络,2010)