HDU 3376 拆点 网络流

http://acm.hdu.edu.cn/showproblem.php?pid=3376

 

这题是2686的加强版,用2686的方法照样可以解决,改成滚动数组就可以,另外也有网络流的解法:

 

拿第一个样例来说:

10  3

5   10

我们可以把每一个点看成两个映像,第一个看成 1与5,第二个 2与6,第三个 3与7,第四个 4与8,外加一个源点 0,汇点 9~

就变成了一个二分图:

            1 5

2 6

0 3 7 9

4 8

接下来就是如何建图了:

1. 首先是源点,因为是从左上角开始,那么很好想,源点0与1连一条边,因为要两条路,那么源点过来的容量要为2,同理是汇点 9 与 8 连边,也是容量为2,两条边的费用都是0;

2. 其次是map[][]图如何对映到二分图上,就拿(1,1)这个点来说,首先它自己和自己的映像(1与5)之间是要建一条费用为map[1][1]即10的边,容量为1,代表(1,1)这个点走过了(走过了就得加上这条边的费用,将点与边对映上去);其次,(1,1)这个点它是可以走到(1,2)与(2,1)这两个点的:

模拟一下二分图,0走到1,1走到5,代表(1,1)这个点走过了,因为5到9是没有边的,

 

接下来为了能走到汇点9,

 

那么5应该回到二分图的左边,走到2或者3的位置,再由二分图的左边走向右边.....可以好好想下这个过程!所以得建5到2,和5到3的边(2,与3对映的是(1,2),(2,1)两点),这条边的容量为1,费用要为0,因为从(1,1)这个点走过来的,加上的只是(1,1)这个点的费用,这在1走到5的时候已经加过了!!要从2,3走到右边,走的时候自然会加上,所以费用为0,不然会导致重复加!

 

 

 

 

 

 

建边真的很奇妙,也就难在这里了,建好图之后就很简单,还是得多做题,接触多一点的建边模型!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值