题目大意
给定n个任务,完成每个任务需要一定的时间,并且任务之间有一定的关系。FAS表示第一个任务需要在第二个任务开始之后完成,FAF表示第一个任务需要在
第二个任务完成之后完成,SAF表示第一个任务需要在第二个任务完成之后开始,SAS表示第一个任务需要在第二个任务开始之后开始。
思路
我们令 start[i] 表示第i个任务的开始时间, cost[i] 表示第i个任务的消耗时间, 那么第 i 个任务的结束时间就应该是 cost[i] + cost[j]
那么根据关系可得:1
2
3
4
5
6
7FAS i j : start[i] + cost[i] >= start[j]
FAF i j : start[i] + cost[i] >= start[j] + cost[j]
SAF i j : start[i] >= start[j] + cost[j],
SAS i j : start[i] >= start[j]
而我们要做的是, 最小化start[i]。
既然是最小化start[i], 那么我们应该把上述的关系是改成start[i] - start[j] >= X 类型的,即:1
2
3
4
5
6
7FAS i j : start[i] - start[j] >= -cost[i]
FAF i j : start[i] - start[j] >= cost[j] - cost[i]
SAF i j : start[i] - start[j] >= cost[j]
SAS i j : start[i] - start[j] >= 0
之后我们只需从 j 建立向 i 的边,以及从 0 向每个节点的边,求一遍最长路就好了
其实还有另外一种做法,可以直接套用最短路模板,把不等式整体乘上 -1 , 这时,所求的最长路就成了最短路(注意建的有向边的方向也会因此改变!)
即:1
2
3
4
5
6
7FAS i j : start[j] - start[i] <= cost[i]
FAF i j : start[j] - start[j] <= cost[i] - cost[j]
SAF i j : start[j] - start[i] <= -cost[j]
SAS i j : start[j] - start[i] <= 0
Code
1 |
|