题目描述
JSOI 王国里有 个机场,编号为 到 。从 号机场到 号机场需要飞行 的时间。由于风向,地理位置和航空管制的因素, 和 并不一定相同。
此外,由于飞机降落之后需要例行维修和加油。当一架飞机降落 号机场时,需要花费 的维护时间才能再次起飞。
JS Airways 一共运营 条航线,其中第 条直飞航线需要在 时刻从 机场起飞,不经停,飞往 机场。
为了简化问题,我们假设 JS Airway 可以在 时刻在任意机场布置任意多架加油维护完毕的飞机;为了减少飞机的使用数,我们允许 JS Airways 增开任意多条临时航线以满足飞机的调度需求。
JYY 想知道,理论上 JS Airways 最少需要多少架飞机才能完成所有这 个航班。
输入格式
第一行包含两个正整数 ,;
接下来一行包含 个正整数表示每一个机场的飞机维护时间;
接下来 行,每行 个非负整数,其中第 行第 个非负整数为 ,表示从 号机场飞往 号机场所需要花费的时间。数据保证 ;
接下来 行,每行三个正整数,其中第 行为 ,表示第 条航线的起飞机场,降落机场,以及起飞时间。数据保证 。
输出格式
一行一个正整数,表示 JS Airways 理论上最少需要的飞机数。
输入输出样例 #1
输入 #1
1 2 3 4 5 6 7 8
| 3 3 100 1 1 0 1 1 1 0 5 2 1 0 1 2 1 2 1 1 3 1 9
|
输出 #1
输入输出样例 #2
输入 #2
1 2 3 4 5 6 7 8
| 3 3 100 1 1 0 1 1 1 0 5 2 1 0 1 2 1 2 1 1 3 1 8
|
输出 #2
说明/提示
样例说明1
在第一个样例中,JS Airways 可以在 时刻在 号机场安排一架飞机并执飞第 条航线()。此外还需要在 时刻在 号机场安排一架飞机,这架飞机首先执飞第 条航线(),然后通过临时新增一条航线从 号机场起飞飞往 号机场,降落 号机场之后执飞第 条航线()。
样例说明2
在第二个样例中,执行完第 条航线的飞机无法赶上第 条航线的起飞时间,因此 JS Airways 必须使用 架不同的飞机才能完成所有的航班。
数据范围
对于 的数据,满足 ;
对于 的数据,满足 ;
对于全部数据,满足 ,,。
题解
把每条航线视作一个点,如果一架飞机在飞完第 条航线后,能飞第 条航线,就从 向 连一条有向边。显然会得到一个 DAG,我们的目标是用尽可能少的飞机飞完所有航线。这是一个 DAG 上的最小路径覆盖的模型。
现在问题来了,如何判断飞完第 条航线后,是否能飞第 条航线呢?
先用 Floyd 预处理从 机场出发,到 机场且具备起飞条件的最短时间 。
设第 条航线的起点为 ,终点为 ,起飞时间为 ,则同一架飞机飞完第 条航线后能飞第 条航线,当且仅当 。