题解 [bzoj3691] 游行
连暴力都不会打.jpg
- 所有需要用邻接矩阵读入的题注意是否有重边!
建议全部用dis[i][j]=min(dis[i][j], read());
来读入
先不想怎么把 C 孤立出来,假设只有 1 次询问
发现不经过和起点不等于终点的代价都是 C
所以考虑让起点不等于终点等价于未经过起点
那就假设一条路径是不覆盖起点的
发现这样还是不好建图
又发现这样的话一条路径可以被断成若干长度为 1 的路径
那就假设一条路径只覆盖终点
容易发现一个点最多作为起点、终点各一次
所以可以建图跑最小点覆盖
这样增广到 \(dis_t>c\) 时停止,剩下的点都用 \(c\) 代价覆盖掉即可
然后考虑处理多次询问
发现每次增广的 \(dis_t\) 是单调的,可以预处理然后每次二分出这个时刻
这样复杂度就可以接受了