题目链接: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之间切割。