题解 [bzoj3691] 游行

传送门

连暴力都不会打.jpg

  • 所有需要用邻接矩阵读入的题注意是否有重边!
    建议全部用 dis[i][j]=min(dis[i][j], read()); 来读入

先不想怎么把 C 孤立出来,假设只有 1 次询问
发现不经过和起点不等于终点的代价都是 C
所以考虑让起点不等于终点等价于未经过起点
那就假设一条路径是不覆盖起点的
发现这样还是不好建图
又发现这样的话一条路径可以被断成若干长度为 1 的路径
那就假设一条路径只覆盖终点
容易发现一个点最多作为起点、终点各一次
所以可以建图跑最小点覆盖
这样增广到 \(dis_t>c\) 时停止,剩下的点都用 \(c\) 代价覆盖掉即可

然后考虑处理多次询问
发现每次增广的 \(dis_t\) 是单调的,可以预处理然后每次二分出这个时刻
这样复杂度就可以接受了

posted @ 2022-03-01 16:34  Administrator-09  阅读(2)  评论(0编辑  收藏  举报