首先, k = 1 k=1 k=1的情况非常简单,你只需要把所有点染成相同颜色即可,这时候答案为 0 0 0,显然是最小的
而对于 k = 2 k=2 k=2且两个附加点颜色相同,则和上面一样,答案为 0 0 0
所以我们只考虑 k = 2 k=2 k=2且两个点异色的情况
下面以样例为例子来解释我们的算法
在这张图中,灰色的方块表示每一个点,灰色的块中的黑、白点指的是这个点的颜色
我们考虑染色结束后的情况,此时,我们可以把这张图分为若干个黑、白连通块,如图所示
假设此时有多于一个块是黑色的,那么这些块的四周一定都是白色的点(否则就是一个连通块而不是两个了),所以这就出现了一个问题:我为什么不把这些黑色的块中的每个点都染成白色呢?这样的话,答案就可以减小很多
例如上图中的右下角的连通块,如果把它改为白色,答案可以减少 5 + 7 = 12 5+7=12 5+7=12!
同理可知,同样也只有一个白色的块
所以,我们可以找到一条分界线,把黑色和白色的点分在这条线的两侧
从图上可以看出,只有被线穿过的边的两侧的点才是异色的,所以我们需要统计的就是这条分界线所穿过的线的权值之和了!
现在,我们的问题转化成了:在这张图上找一条线,使得这条线把这张图分为两块,并且线上的边权之和最小
好,看看上面的那张图,如果我们把每一条边的边权当做是红色的折线(即分界线)的每段线上的边权之和,这一问题不就转化成了最短路的问题了吗?
在这张图中,左上角和右下角的两个点就是最短路的起点和终点,没有数字的边意味着这条边的权值为 0 0 0,也就是说,我们可以从左上部的任意一个点,走到右下部的任意一个点
从图中可以看出,最短的路径就是 3 + 4 + 5 = 12 3+4+5=12 3+4+5=12,把这条路径当做分割线,将原图分为两半染色后,所求的答案就是 3 + 4 + 5 = 12 3+4+5=12 3+4+5=12!
我们接着考虑一个小优化,为的是让建图的过程变得简便,我们把整张图变为一个矩形,在无用的虚边上将权值设置为 0 0 0,如图:
我们可以看到,起点和终点分别位于两个附加点连成的线的两侧,这是因为一条分割线一定经过两个附加点的不同侧,否则无法把它们两个分开,所以两个点必须在不同侧
这样,我们就成功地解决了 k ⩽ 2 k\leqslant 2 k⩽2的情况,得到了 36 36 36分