poj 3041 匈牙利算法

题目链接:http://poj.org/problem?id=3041

题目大意:贝西要乘飞船经过一个分布着小行星的矩形空间,为了把所有小行星击毙,她的武器只能一次击中在同一行或同一列上的所有行星,为了使武器花费最小,求至少要射击多少次才能使所有小行星都消失。

思路:对asteroids标记为1,其余标记为0,那么问题就是对一个01矩阵,选择若干行和列,可以覆盖所有的1,可以这样建二分图:以行号为左节点,列号为右节点,i行j列为1,那么i和j有条边,那么问题就是从左边和右边选择最少的点可以覆盖所有的边,这不就是最小覆盖问题吗?

最小覆盖: 最小覆盖要求用最少的点(左右两边的点)让每条边都至少和其中一个点关联。

由König定理,一个二分图中的最小点覆盖数等于这个图中的最大匹配数,那么问题就划归为求2分图的最大匹配,最大匹配用匈牙利算法

 

看网上还有种说法:虽然,最大匹配跟最小割原理一样,都从题意理解方面考虑,用最小割概念会好理解很多!

分析: 把所有的row作为left nodes,把所有的column作为right nodes.设多一个源点跟汇点,源点连left nodes,汇点连right odes,而left nodes跟right nodes之间的连边则由asteroids决定,这样就建立了一个网络图了。 由于题意是要销毁所有的asteroids,也就是说让left nodes跟right nodes之间不再有连边,即是让left nodes跟right nodes成为两个独立集。而题目说要用做少的销毁次数达到目的,也就是说要去掉最少的边,让left nodes跟right nodes成为独立集,我们很容易就可以想到最小割原理了,并且只在left nodes跟right nodes之间切割。

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值