洛谷P7916 [CSP-S 2021]交通规划

洛谷P7916 [CSP-S 2021]交通规划

  • Part1 k ⩽ 2 k\leqslant 2 k2的情况
    • Step1 分析
    • Step2 计算分界线上边权之和
  • Part2 正解
    • Step1 k = 3 k=3 k=3
    • Step2 配对
  • Part3 代码

如果你没有学习过对偶图等知识,那么对你来说其他题解可能有点难理解,但这篇题解不会!在阅读这篇题解之前,你不需要掌握任何高深的知识,就可以学会这道题的做法

Part1 k ⩽ 2 k\leqslant 2 k2的情况

Step1 分析

首先, k = 1 k=1 k=1的情况非常简单,你只需要把所有点染成相同颜色即可,这时候答案为 0 0 0,显然是最小的
而对于 k = 2 k=2 k=2且两个附加点颜色相同,则和上面一样,答案为 0 0 0
所以我们只考虑 k = 2 k=2 k=2且两个点异色的情况
下面以样例为例子来解释我们的算法
洛谷P7916 [CSP-S 2021]交通规划_第1张图片
在这张图中,灰色的方块表示每一个点,灰色的块中的黑、白点指的是这个点的颜色
我们考虑染色结束后的情况,此时,我们可以把这张图分为若干个黑、白连通块,如图所示
洛谷P7916 [CSP-S 2021]交通规划_第2张图片

假设此时有多于一个块是黑色的,那么这些块的四周一定都是白色的点(否则就是一个连通块而不是两个了),所以这就出现了一个问题:我为什么不把这些黑色的块中的每个点都染成白色呢?这样的话,答案就可以减小很多
例如上图中的右下角的连通块,如果把它改为白色,答案可以减少 5 + 7 = 12 5+7=12 5+7=12
同理可知,同样也只有一个白色的块
所以,我们可以找到一条分界线,把黑色和白色的点分在这条线的两侧
洛谷P7916 [CSP-S 2021]交通规划_第3张图片
从图上可以看出,只有被线穿过的边的两侧的点才是异色的,所以我们需要统计的就是这条分界线所穿过的线的权值之和了!

Step2 计算分界线上边权之和

现在,我们的问题转化成了:在这张图上找一条线,使得这条线把这张图分为两块,并且线上的边权之和最小
好,看看上面的那张图,如果我们把每一条边的边权当做是红色的折线(即分界线)的每段线上的边权之和,这一问题不就转化成了最短路的问题了吗?
洛谷P7916 [CSP-S 2021]交通规划_第4张图片
在这张图中,左上角和右下角的两个点就是最短路的起点和终点,没有数字的边意味着这条边的权值为 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,如图:
洛谷P7916 [CSP-S 2021]交通规划_第5张图片
我们可以看到,起点和终点分别位于两个附加点连成的线的两侧,这是因为一条分割线一定经过两个附加点的不同侧,否则无法把它们两个分开,所以两个点必须在不同侧
这样,我们就成功地解决了 k ⩽ 2 k\leqslant 2 k2的情况,得到了 36 36 36

Part2 正解

Step1 k = 3 k=3

你可能感兴趣的:(#,洛谷,题解,动态规划,图论)