本次报告撰写人:WilliamZH
题目:202012-4,第21次CCFCSP
使用语言:C++
202012-4 食材运输
题目描述:
$N$ 个酒店,由 $N-1$ 条双向道路构成一棵树,不同道路对应不同通行时间。
$K$ 种食材对应 $K$ 辆车,$M$ 个检查点作为车辆起点。
求所有酒店的等待时间的最大值的最小值。
输入格式:
第一行 $N,M,K$;接下来 $N$ 行,每行 $K$ 个数($1$ 表示需要对应食材,$0$ 表示不需要);接下来 $N-1$ 行,每行 $3$ 个整数 $u,v,w$(通行时间为 $w$ 的双向道路连接 $u$ 和 $v$)。
输出格式:
输出一个整数,表示在你的方案中,所有酒店的等待时间的最大值。
$N\leq10^2,M\leq K\leq10$.
题解:
主要思路:先预处理所有数据,然后进行动态规划,最后二分查找来尝试不同的时间(通过时间选择方案)
- 存储所有数据:
用位图表示来处理各个酒店所需要的食材,用 $01$ 表示各食材的需求情况:第 $i$ 位表示对第 $i$ 号食材的需求($1$ 表示需要,$0$ 则不需要),从而将所有食材压缩到一个整数上,该整数表示该点对所有食材的需求情况。
对于每个节点存储的信息(指向酒店 $v$,与 $v$ 之间道路时长 $w$),通过 $vector$ 结构进行添加信息,因为是双向道路,所以需要同时对 $u,v$ 都进行添加。 - $intitial$ 函数部分:
计算从酒店 $i$ 出发,配送食材 $j$ 的最大等待时间。
在进行 $dfs$ 之前,用 $bool$ 数组标记出哪些酒店需要该食材;需要注意的是,在 $dfs$ 中,某些必经点(下图的蓝色节点)也要标记出来。(每个标记循环前需要将该数组置零)
$dfs$ 部分:提供当前酒店号 $u$,和来源酒店号 $pre$。(当前节点和上一个节点)
求解最大等待时间算法解释:
其实只分为两种情况:- 该节点 $\to$ 不需要食材的节点(蓝色路径) $\to$ 需要食材的节点(黑色路径)
- 该节点 $\to$ 需要食材的节点 (黑色路径)
则总路径应为其中一条子路径走一次,其余子路径去并返回。即 $maxtime=onetime*2-maxn$,其中 $onetime$ 表示全部的单程路径,$maxn$ 表示途中红色的最长的路径。
- $work$ 函数部分:
- $M==K$
先遍历各食材最小解,从最小解里选出最大值。 - $M<K$
备忘录 dp+二分查找
用位图标记某酒店是否适合配送每一个食材(时长<mid 表示适合)
dp 方程:
第 j 个检查点的配送情况=第 $j-1$ 个检查点情况叠加酒店 i 的配送情况
- $M==K$
1 |
|