【题解】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}))\)

代码记录

posted @ 2021-09-08 12:26  Themaxmaxmax  阅读(186)  评论(0)    收藏  举报