hdu3395 -- 二分图带权匹配

    题意比较好懂,把每个鱼拆成两个点,就形成了一张二分图,每条边有一个特定的权值,我们就需要找出一个边集使得边权和达到最大。

    思路:刚开始的时候是最大费用最大流,直接利用二分图匹配的特性,即每个X集里的点和Y集里的点只能覆盖一次,而每条边匹配一次,就加上一个源点s连接所有X集顶点,容量1,费用0,所有Y集顶点连接汇点t,容量1,费用0,这样就可以很好的保持,满足二分匹配的特性。然后提交WA,感觉比较奇怪,在网上看到有人解释,通过这样求费用最大流,首先满足的是在组成匹配最多的情况下,所产生的费用最大值,但其实,这道题很显然不用匹配最多的情况,反而可以达到最大值。

    那么应该如何去建图呢,实在想不出来,如何使得最大流不去扩展,而达到费用最大,这是突然就想到在寻找增广路的情况下,每次寻找的增广路肯定是开始时费用是最大,然后逐渐变小,在费用达到最大的情况下,为了使得匹配加一,而让费用变小。突然有一个想法,在费用的内部实现里面,用spfa每次寻找费用最大的增广路径,可以可以让在当然需要增广的费用边为0时就停止算法,这时的费用可能就是最大的费用,然后试着交了一下。刚开始以为数据太弱,后来发现,在二分图中,应该是存在每次增广费用的逐渐减小(求最大费用的时候),然后就试着证了一下,也不知道这样证对不对。也许是存在这样的定理的。

 

    证明,首先在一般图的费用流中肯定是不存在费用的递增或递减的关系的,在这种特殊的二分图中,才存在这样的规律。

   

 

 

反证法

  (1)假设在寻找到一次负费用的增广路经之后,又能够找到一条正的,依次来推翻我们之前的结论。

  (2)如果第一次寻找到的增广路径和第二条路径完全没有重合,那么肯定会先找到正费用再是负费用,不可能,那么第二条增广路径肯定也第一条有部分重合,假设形成了下面这张图。最初的两条匹配是灰色的两条匹配,第一条增广路径是蓝色和灰色相间形成的,灰色匹配删去,绿色匹配加入,第二条增广路径是两条粉红的加上中间的绿色匹配,绿色匹配删去,粉红加入,形成4的匹配,同时这条匹配也是正的。

   (3)在上图中,因为第一条第二条匹配链式重合的,所以这就意味这有这么一条边先加入再删除,那么就可以根据这条边的两端形成另外两条增广路径,这样子形成的结果和之前的是一样的,用上面一张图来举例,左右两端可以形成画着箭头1和箭头2的两条增广路径,通过这两条增广路径形成的结果和之前的那两条都是一样的,结果是存在了,旁边的两条绿色匹配和粉红色的两条匹配。

  (4)在整个过程中,总的费用即总的边权变化用图中表示出来的字母表示就是 △=X1+X2+X2-Y1-Y2+Z1+Z2
其中如果分段表示出来就是 △一阶段=X1+X2+X3-Y1-Y2  △二阶段=Z1+Z2-X3
△左边=X1-Y1+Z1 △右边=X2--Y2+Z2 
所以就是△左边+△右边 = △一阶段+△二阶段,又因为这道题中我们要求第一条增广链是正的,第二条是负的,所以他们的和是正的,那么△左边和△右边之间必有一者是正的,那么按照选择费用流的规则,肯定会先选择那条正的增广链,得证。如果他们的和是负的,这个负的值肯定比△一阶段大,那么除2之后的平均值还是比△第一阶段大,所以还是不会先选择第一条增广链,这样就成功证明了在选择了负的增广链之后,肯定不会出现了正的费用了,相同的证明思想,可以证明每次增广路出来的费用是单调递减的。这个结论在这种二分图求费用中成立。

    这道题在这一点上可能比较难想到,就算想到了,也很难在短时间内想到它的正确性,还有另外一种比较好的方法,可以求出在不限制匹配数的情况下的最大费用。就是在每次增广的时候,每次求出的增广路径的容量必定是1的,而最大费用流的性质每次求出的就是当前容量下的最大费用。所以在整个增广的过程中,相当于其实已经算出了在任意容量下的最大费用,在跑费用流的过程中,直接记录下最大值,不就是最大费用流了嘛?

    这道题在网上看的另外一种正规的建图思想就是因为在跑费用流的过程中,会因为匹配数影响费用的大小,所以在建图的时候我们就要消除匹配数的影响,但又不影响费用。就可以这么操作,把X集的所有顶点直接连接到一个中间点tem,容量是1,费用0,再把tem到汇点建一条边,容量正无穷,费用0,如此建图,每次跑出的最大流都是X集顶点的个数。而在这种情况下的最大费用完全不受到匹配数的影响,真是好巧妙的建图方法。

总结一下,如果要跑最大匹配下的最大费用,直接建图费用流,如果不限制匹配数,那么只需记录所有流量下的费用取最大即可,免去了多建边,还可以少跑spfa(增广次数少了),很好的方法。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值