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)\)

经验:

枚举的时候,如果要枚举三个 "连着" 的数,通常是枚举中间的,然后再预处理左右的。
那如果是四个 “连着” 的数,往往可以假设固定了三个,来优化最后一个的最优情况,然后就可以少同时枚举枚举与他无关的东西。

posted @ 2025-04-04 21:03  positive_deviation  阅读(6)  评论(0)    收藏  举报