火星人侵略地球,他们意图登陆破坏某个地区的兵器工厂。据探子回报,火星人登陆的地区为n*m大小的地域,而且每一个火星人的着陆点坐标已知。
火星人很强悍,只要有一个火星人着陆后能够幸存,他必定能毁坏这片区域的全部兵工厂。为了防止这种情况发生,必须保证在火星人着陆的一瞬间把他们全部同时杀死。
现在防卫队有一个激光枪,开一枪就能把 在同一行(或同一列)着陆的火星人全部杀死。但是这种激光枪的使用是有代价的,把这种激光枪安装到不同行的行首、或者不同列的列首,费用都不同。现在已知把激光枪安装到任意位置的费用,总的花费为这些安装了激光枪的行列花费的乘积。
问怎样安装激光枪才能在杀死所有火星人的前提下费用最少?
这里因为要求的是乘积,不是加和,所以需要用log( a )+log( b ) = log( a * b )转化;
对于矩阵中的一个需要覆盖的点A,覆盖该点所在的行的花费是 wr ,覆盖该点所在列的花费是 wc;把点 A 按行标和列标拆成 X 和 Y 两个点,从源点连一条到 X 的边,权值为log( wr ),X 和 Y 之间连一条权值为无穷大的边,Y 到汇点连一条权值为 log( wc )的边,求最大流即可。