题目来源 :
题目大意 :有N(1 <= N <= 1000)个任务要用K(1 <= K <= 50)台机器完成,每个任务持续一段时间Si ~ Si + Ti - 1,每个任务可以获利Ci,(1 ≤ Si , Ti ≤ 109 , 1 ≤ Ci ≤ 106 ) 。每台机器同一时间内只能处理至多1个任务。满足以上限制条件,求这K台机器能取得的最大利润是多少?
题目解析 : 从贪心角度看,如果存在多个时间不相交的任务,那么这些任务只需要1台机器去完成。因此,每台机器处理的就是这样的一系列不相交的任务。那么对于时间相交的任务,就需要用多台机器去完成。一共有K台机器,那么问题转化为求K条不相交任务集合,使得总获利最大。
本题和《线性规划与网络流24题 -- 最长 k 可重区间集》建模方法一模一样。将所有任务的时间离散化,编号为1..L。设立源点S和汇点T,建立有向边S->1,容量为K,费用为0;(表示最多有K条不相交任务集合)建立有向边L->T,容量为INF, 费用为0;建立有向边I(1 ~ L - 1)->I + 1,容量为INF,费用为0;对于每个任务的时间Si 和 Si + Ti - 1 所对应的编号 X和Y,建立有向边X->Y,容量为1,费用为-Ci。求最小费用最大流。
模型的理解 : 每个任务限制容量为1,表示只被完成1次,然后获利就是这条边的费用,写成负数是为了求最小费用,实际原问题属于最大费用最大流。并且以时间为端点,不相交的任务可以用同一台机器去完成,相交的任务只能用多台机器去完成。
另外题目要求的是路径,而不是最大费用那个值。因此要把费用为负数的满流边记录下来,最后输出。
代码如下 :
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include