[BZOJ3140][Hnoi2013]消毒
首先由均值不等式可以得到,min{a, b, c} <= 17
,不妨假设最短的那条边为a
。接下来考虑消除,答案肯定不会超过a
,因为可以做若干次1*b*c
的消除。
一开始看到这个结论我还是非常傻逼的以为,只要把需要消毒的每一片1*b*c
都消毒即可,还傻傻问副队哪来的二分图……经过副队的教导才意识到这样不一定最优,比较科学的做法是:2^a
枚举每层是否消掉,然后用a*1*c
和a*b*1
的片覆盖,也就是转成二维的最小棋盘覆盖。
所谓最小棋盘覆盖就是说,每次可以覆盖掉棋盘的一整行或一整列,问把所有标记点覆盖的最小次数。嗯,这个也不会做……Google了一下,看到搜索结果里面最小点覆盖和行列拆开这两个关键词才突然意识到,这不就是个水水的二分图匹配嘛。
考虑把所有行放在左边,所有列放在右边,然后如果(i, j)
需要被覆盖,那么连边(Xi, Yj)
。之后就是一个最小点覆盖的问题了(选择最少的点,使得每条边都至少有一个端点被选择),因为最小点覆盖=最大匹配,所以轻松做掉了。(这个时候突然很庆幸前不久刚学匈牙利,明显这种时候用匈牙利跑匹配比网络流省事多了=v=)