[BJWC2018]Kakuro

Kakuro

题解

多水的一道题呀

其实看到题目应该是很容易想到网络流的。
由于它要求的是每列或每行的总和一定,我们可以先找出一组可行解,再来再这组解上修改。
观察到对于一个数,它无论增加还是减少它的单位花费都是一定的,所以我们可以先找出一组最小的可行解,这样之后就处理增加多少。
而最小的可行解明显是所有空格都取1(题目要求的是正整数),所有线索都取它右侧或下侧的方格数。我们可以先预处理出这样的解它的答案是多少。
对于不能变动的点我们就把它的变动的花费设为inf,只需要最后特判一下,不会影响到最后的答案。

我们考虑再这组解上做改动来找出最优解。
由于这组解已经是最小的了,我们只考虑每个空格或线索增加的情况。
很容易发现,当一个空格增加时它会影响到它所对应的上方与左方线索。由于它的增加量与这些线索的增加量是一样的,我们可以将它想象成网络流的一条边,连接上方线索与左方线索两个点。
而对于它所对应上方线索与左方线索,他们的性质一定是不一样的,我们可以将其分列两边,分别与源点与汇点相连。
对于任意一条经过这个空格的路径,它一定经过了不超过一个的上方线索和左方线索,它的流量表示它们共同增加了多少(与源点相连的边流量表示上方线索的增加量,两个线索的连边的流量代表它们共同对应的空格的增加量,与汇点相连的边的流量代表左方线索的增加量),故它的费用也该对应增加这么多流量的费用。

我们注意到对于这些最小解中的线索与空

posted @ 2021-02-06 16:11  StaroForgin  阅读(15)  评论(0)    收藏  举报  来源