CF1483 D
题目大意:
给定一个有 \(n\) 顶点的加权无向图以及 \(q\) 三元组 \((u, v, l)\) ,其中每个三元组 \(u\) 和 \(v\) 是顶点, \(l\) 是一个正整数。如果至少有一个三元组 \((u, v, l)\) 和一个具有以下属性的路径(不一定简单),则称边 \(e\) 是有用的:
-
\(u\) 和 \(v\) 是该路径的端点,
-
\(e\) 是该路径的一条边,
-该路径上所有边的权值之和不超过 \(l\) 。
请求出这张图中有用边的数目。
\(n \le 600, m,q \le \frac{n \times (n - 1)}{2}\)
解题思路:
考虑 \(x,y,w\) 有用,当且仅当存在 \(u,v,l\) 使得 \(u->x + w + y->v \le l\)。
其中 \(x->y\) 表示 \(x\) 到 \(y\) 的最短路径,这是可以拿 \(FLoyd\) 来 \(O(n^3)\) 求的。
假设固定的 \(x,y,v\),那么由于只关心 \(x,y\) 这条边有不有用,所以一定只需判断一个最优的 \(u\)。
\[dis_{u,x}+w+dis_{y,v} \le l
\]
\[w + dis_{y,v} \le l - dis_{u, x}
\]
所以最优的 \(u\) 一定是 \(l - dis_{u,x}\) 最大的。
那么枚举 \(x,v\),预处理出最小的 \(l - dis_{u,x}\)。
然后枚举 \(y\) 判断即可。
\(O(n^3)\)。
经验:
枚举的时候,如果要枚举三个 "连着" 的数,通常是枚举中间的,然后再预处理左右的。
那如果是四个 “连着” 的数,往往可以假设固定了三个,来优化最后一个的最优情况,然后就可以少同时枚举枚举与他无关的东西。

浙公网安备 33010602011771号