题目大意
给定n个任务,完成每个任务需要一定的时间,并且任务之间有一定的关系。FAS表示第一个任务需要在第二个任务开始之后完成,FAF表示第一个任务需要在
第二个任务完成之后完成,SAF表示第一个任务需要在第二个任务完成之后开始,SAS表示第一个任务需要在第二个任务开始之后开始。
思路
我们令 start[i] 表示第i个任务的开始时间, cost[i] 表示第i个任务的消耗时间, 那么第 i 个任务的结束时间就应该是 cost[i] + cost[j]
那么根据关系可得:
1 | FAS i j : start[i] + cost[i] >= start[j] |
而我们要做的是, 最小化start[i]。
既然是最小化start[i], 那么我们应该把上述的关系是改成start[i] - start[j] >= X 类型的,即:
1 | FAS i j : start[i] - start[j] >= -cost[i] |
之后我们只需从 j 建立向 i 的边,以及从 0 向每个节点的边,求一遍最长路就好了
其实还有另外一种做法,可以直接套用最短路模板,把不等式整体乘上 -1 , 这时,所求的最长路就成了最短路(注意建的有向边的方向也会因此改变!)
即:
1 | FAS i j : start[j] - start[i] <= cost[i] |
Code
1 |
|
- 本文作者: 水蓝络合物
- 本文链接: https://miku39393939.github.io/2021/05/10/2021-05-05-HDU1534/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!