参考:https://blog.csdn.net/sd_invol/article/details/15813671
要点
- 每个任务的结束时间是固定的,不受任何因素影响
- 机器只在最一开始有用,在那之后都是任务之间的转换
连边
将任务拆点,入点 i, 出点 i', 连边 (i, i' [1,1], 0)
设源点 s_, 汇点 t_
- 对于机器 (i (i in [1, m])), 连 (s_, i, 1, 0),即流量为1,费用为0
- 对每个任务 (j)
- 如果 (C[i][j] le ss[i]),连 (i, j, 1, D[i][j])
- 否则如果 (C[i][j] < tt[j]),连 (i, j, 1, D[i][j] + k*(C[i][j] - s[j]))
- 否则不连边
- 对每个任务 (j)
- 对于每个任务 (i(iin[1,n])),
- 连 (i, i', [1,1],0), 即流量在 [1,1]范围内,费用为0的边
- 连 (i',t_, 1, 0)
- 对于另一个任务 j,考虑 i -> j 的转换, 即 (endTime = tt[i] + E[i][j])
- 如果 (endTime le ss[j]), 连(i', j, 1, F[i][j])
- 否则如果 (endTime lt tt[j]) ,连 (i', j, 1, F[i][j] + k * (endTime - ss[j]))
- 否则不连边
然后对该网络求有源汇的上下界网络流即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
#define dbg(x...) do { cout << "