【题解】CF576D Flights for Regular Customers bitset优化01矩阵乘法、最短路
在部分图论题目中,将边权理解为时间会更容易理解。
令 \(S_i\) 表示从点 \(1\) 走 \(i\) 条边可达的点集,图 \(G_i\) 表示由所有 \(d\le i\) 的边构成的图。
对于一部分“解锁、点亮”边的问题,通常来说随着满足条件规模的增大,点亮的边越多,可以考虑对于任意前缀点亮的边的 “导出子图”。
考虑任意一条从点 \(1\) 到点 \(n\) 符合要求的路径,对于路径上的任意一条边 \((u\to v,d_i)\) ,一定满足在经过该边之前经过了 \(d_i\) 条边,考虑 \(d_i\) 最大的一条边 \((u\to v,d_i)\) ,一定有 \(u\in S_{m},m\ge d_i\) ,那么在该路径上一定存在一个点 \(p\) 满足 \(p\in S_{d_i}\) 并且 路径 \(p\to n\) 一定是 \(G_{d_i}\) 的一条路径。
并且边的 “解锁” 顺序一定是按 \(d_i\) 从小到大解锁的,因此先考虑套路地将所有边按 \(d_i\) 排序。
struct edge{
int u,v,d;
edge (const int &U,const int &V,const int &D) : u(U),v(V),d(D) {}
//不能写成return d <= B.d;
inline bool operator<(const edge &B) const {return d < B.d;}
};
考虑枚举 \(G_{d_i}\) \(0-1\) 矩阵乘法动态维护 \(S_{d_i}\) ,用 \(\text{floyd}\) 动态维护多源最短路,即每次加边 \((u\to v,d_i)\) 时动态维护 \(S_{d_i}\) ,并更新多源最短路,用 \(\text{bitset}\) 维护 \(0-1\) 矩阵乘法总的复杂度为 \(O(m(n^2+\dfrac{n^3\log d}{w}))\) 。

浙公网安备 33010602011771号