本题的关键在于在每次二分中,如何快速判断是否存在一条路径使得经过的边权值都小于等于mid,这里我们可以采用DFS来判断。但是普通的DFS可能会超时,因此可以对DFS进行一些优化。

首先,我们可以将每个点的过路费按照从小到大的顺序进行排序,这样可以保证在DFS过程中,先访问的节点的过路费一定小于等于后访问的节点的过路费,这可以减少搜索的次数。

其次,我们可以使用一个vis数组来记录每个点是否已经被访问过,如果一个点被访问过了,就不需要再次访问,这样也可以减少搜索的次数。

最后,在DFS中,我们需要判断当前节点是否可以到达终点,如果可以到达,则返回true,否则继续搜索其他的节点。如果所有节点都搜索完了,还没有找到一条路径使得经过的边权值都小于等于mid,那么返回false。

时间复杂度为O(nlogn*logW),其中W为过路费的最大值。

#include iostream#include cstring#include algorithmusing namespace std;const int MAXN = 1000;const int INF = 1e9;int tollMAXN;int GMAXNMAXN;bool visMAXN;bool dfsint u int v int maxtoll int health int

原文地址: https://www.cveoy.top/t/topic/cILQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录