POJ 2396 Budget 带下界的最大流 Dinic

这篇博客介绍了如何将一个约束条件复杂的正数填充方阵问题转化为带上下界的最大流问题。通过建立源点、汇点以及根据约束条件设定边的容量上下界,利用Dinic算法求解最大流。如果所有从源点出发的边均满流,那么原问题有解,否则无解。最后,可以通过求解最大流得到具体的方阵填充方案。
摘要由CSDN通过智能技术生成

参考:http://hi.baidu.com/%CD%F4%BD%ADwangjiang/blog/item/aa3bc8ec3d549edbb31cb1a3.html 

http://apps.hi.baidu.com/share/detail/31832477

题意:现在有一个n*m的方阵,方阵里面的数字未知,但是我们知道如下约束条件:
            1> 每一行的数字的和
            2> 每一列的数字的和
            3> 某些格子有特殊的大小约束,用大于号,小于号和等于号表示
   求解是否存在在满足所有的约束的条件下用正数来填充该方阵的方案,若有,输出填充后的方阵,否则输出IMPOSSIBLE.
   这道题可以转化成容量有上下界的最大流问题,将方阵的行从1……n编号,列n+1……n+m编号,添加源点s=0和汇点t=n+m+1.
            1> 将源点和每一个行节点相连,相连所形成的边的容量的上下界都置为该行所有数字的和
            2> 将每一个列节点和汇点相连,相连所形成的边的容量的上下界都置为该列所有数字的和
            3> 如果u行v列的数字大于w,则将行节点u和列节点v+n相连,w为该边容量的下界,即置low[u][v+n]=max(low[u][v+n],w+1)
            4> 如果u行v列的数字小于w,则将行节点u和列节点v+n相连,w为该边容量的上界,即置high[u][v+n]=min(high[u][v+n],w-1)
            5> 如果u行v列的数字等于w,则将行节点u和列节点v+n相连,w既为该边容量的下界同时也为该边容量的上界,即置low[u][v+n]=high[u][v+n]=w

 

可以将每列看成一个结点,每行看成一个结点,给每行,每列各建立一个节点。
源点s与每个行节点连接(流量的上下界限制为每行的和),每个列节点与汇点t连接(流量的上下界限制为每列的和)。
从每个行节点流出col条边,流量的上下界从input的条件中获取,同理,每个列节点,有row条边流入。
这样如果存在最大流,一定是唯一的行和或列和,即符合条件限制。那么某行某列的两结点间的边的容量就是该行该列元素上下界容量(即元素的限制)之差。。这样最大流后确保满足题中行列和性质。再新建一个源点ss和汇点tt,那么ss到每个结点的边下界就是该结点入边下界容量和,各点到tt边的下界容量为该结点出边下界容量和。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值