LuoguP1967货车运输。
题目描述
A国有$n$座城市,编号从$1$到$n$,城市之间有 $m$ 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 $q$ 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。
输入输出格式
输入格式
第一行有两个用一个空格隔开的整数 $n,m$,表示 $A$ 国有 $n$ 座城市和$m$条道路。
接下来$m$行每行$3$个整数 $x, y, z$,每两个整数之间用一个空格隔开,表示从$x$号城市到$y$号城市有一条限重为$z$的道路。注意:$x$ 不等于 $y$,两座城市之间可能有多条道路 。
接下来一行有一个整数 $q$,表示有$q$ 辆货车需要运货。
接下来 $q$ 行,每行两个整数$ x,y$,之间用一个空格隔开,表示一辆货车需要从 $x$ 城市运输货物到 $y$ 城市,注意: $x$ 不等于 $y$。
输出格式
共有 $q$ 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。如果货车不能到达目的地,输出$-1$。
INPUT & OUTPUT’s examples
Input’s e.g. #1
1 | 4 3 |
Output’s e.g. #1
1 | 3 |
分析
首先看完题我们就能想到Floyd最长路的算法,时间复杂度$O(n^3)$.
我们设一个$weight$数组来表示最大载重,状态转移方程式也不难推出,为:
$$w_{i,j} = max(w_{i,j},min(w_{i,k},w_{k,j}))$$
开始考虑优化:
我们可以发现,很多权值较小的边绝对不在我们的考虑范围内,所以我们可以将它们去掉。
因为我们要求走过的边权尽可能大,所以我们可以构建一棵最大生成树。
现在有了这样一棵最大生成树,我们就要考虑如何求出两个节点之间的最小边权的最大值。
因为树上的两个节点之间只有唯一的一条路径,所以我们就可以求出这两个点的最近公共祖先(这里我们用树上倍增实现)
此题代码实现难度和思考难度均较大(对于Herself32这种菜鸡来说),是一道不错的图论进阶题目。
代码
1 | /* Headers */ |