本题题意就是,公元XXXX年,地球跟外星人打仗,然后有一个n*m的网格,会有外星人降落到某些位置上,因为外星人比较猛,所以必须一下来就消灭他们,现在可以在某些行或者某些列的首部放一些激光枪。这些枪的特性就是你放在行的首部你就消灭这一行的敌人,放在列的首部就消灭一列的敌人。但是放置这些枪也需要一定的费用,这些费用已经给出来了,最后总费用是这些枪的费用之积,现在要求最小的这个费用。
看到积之后,我们可以转换为加法,就是取log,但是不知道数据是什么情况,会不会超过double,就试一下。
然后就能发现是一个二分图最小点权覆盖的模型了
然后就是建图,源点跟所有的行节点连边,值呢就是相应花费的log,然后列节点与汇点连边,值也为相应的花费的log,行与列的连边就代表着相应的外星人了,值为INF。
注意到INF不能太大,因为double的精度问题,INF如果位数太多,算最大流的时候由于有小数,小数点后如果有8位,小数点之前如果再有太多的位数,就会损失精度
最后的结果用exp函数求回来即可
[cpp]
#include
#include
#include
#include
#include
#include
#include
#include