在二分图中,有一个问题是,顶点覆盖问题。
图G的一个顶点覆盖是由一些顶点构成的集合Q包含于V(G), Q包含每条边上的至少一个端点。Q的所有顶点覆盖边集E(G)。
如果覆盖每个顶点需要付出不同的代价,也可以说是不同的花费,或称为点权,问题可以描述成,在保证覆盖所有边的情况下,如何使得权和最小。
这里只讲二分图。
我们可以建源点 S 和汇点 T,假设二分图两个点集分别为 X 和 Y。X和Y原来的边容量设为INF,将S到X里每个点x连一条边,边权为x的点权,也可以看做覆盖点x的所有出边的花费(W-),将Y里每个点y到T连一条边,边权为y的点权,也可以看做覆盖点y的所有入边的花费(W+)。这样求得最小割容量,即为原问题的解。
可以这样理解:X到Y的边权为INF,自然不会成为最小割中的边,那就只有可能是S到X和Y到T中的边,而:S到X中点x的边e1, 权为点x的点权,点x和Y中的所有临边e2,都需要受到e1的流量的限制,同样,X到Y中点y的所有边也会受到点y到T的容量限制。这样求得割就能保证覆盖掉所有的边。
我们可以用反证法证明一下:假设有边<x, y>没有被覆盖掉,则边<S, x>流量为0且边<y, T>流量为0,而<x, y>流量为INF,自然可以找到一条S到T的增流路径<S, x, y, T>,与以求得流为最大流相矛盾,则可以说明,在最大流的情况下,所有的边都已经被覆盖掉。
而最小割问题可以用最大流来解决,问题就变得简单了。
Paratroopers
这道题就是一个很好的例子。
题意:一次火星和地球的大战,火星要进攻地球,将在一块m * n 的地方降落伞兵,地球上的指挥官得到这一消息,要在某几行或某几列打造一种武器,只需要一件武器,就可以干掉整行或整列敌人。问如何安排才能消灭所有敌人,不同的武器代价不同,这整个防御系统的建造等于各个武器的cost之积。
分析:把伞兵看成边,行列看成节点,行看做X集合,列看做Y集合,如果a行b列有敌人,则把节点a和节点b相连。这题求得是cost之积最大,可以用log对每条边求一次对数,则可以转化成求和问题,求得结果用exp函数在换回来,转化成最小割,在转化成最大流,这样就可以用上述方法求解了。
数据量小,用邻接矩阵 + EK 就能过。