[BJWC2018]Kakuro
Kakuro
题解
多水的一道题呀
其实看到题目应该是很容易想到网络流的。
 由于它要求的是每列或每行的总和一定,我们可以先找出一组可行解,再来再这组解上修改。
 观察到对于一个数,它无论增加还是减少它的单位花费都是一定的,所以我们可以先找出一组最小的可行解,这样之后就处理增加多少。
 而最小的可行解明显是所有空格都取1(题目要求的是正整数),所有线索都取它右侧或下侧的方格数。我们可以先预处理出这样的解它的答案是多少。
 对于不能变动的点我们就把它的变动的花费设为inf,只需要最后特判一下,不会影响到最后的答案。
我们考虑再这组解上做改动来找出最优解。
 由于这组解已经是最小的了,我们只考虑每个空格或线索增加的情况。
 很容易发现,当一个空格增加时它会影响到它所对应的上方与左方线索。由于它的增加量与这些线索的增加量是一样的,我们可以将它想象成网络流的一条边,连接上方线索与左方线索两个点。
 而对于它所对应上方线索与左方线索,他们的性质一定是不一样的,我们可以将其分列两边,分别与源点与汇点相连。
 对于任意一条经过这个空格的路径,它一定经过了不超过一个的上方线索和左方线索,它的流量表示它们共同增加了多少(与源点相连的边流量表示上方线索的增加量,两个线索的连边的流量代表它们共同对应的空格的增加量,与汇点相连的边的流量代表左方线索的增加量),故它的费用也该对应增加这么多流量的费用。
我们注意到对于这些最小解中的线索与空
                    
                
                
            
        
浙公网安备 33010602011771号