問題:M 台機器,N 個任務。任務 i 需佔用 1 台機器 P_i 天,開始時間 ≥ S_i,結束時間 ≤ E_i。任務可中斷、可在不同機器、不同日期分段完成。機器同一時間只能做一個任務。問是否能完成所有任務。
若最大流等於 ΣP_i,則可行;否則不可行。
l[u] = -1 剪枝(當前弧優化)。struct Edge { int v, w, next; } edge[555000];
int head[2010], level[2010], M, cnt;
void add(int u, int v, int w) { ... } // 雙向邊
bool bfs() { ... } // 分層圖
int dfs(int u, int f) { ... } // 阻塞流
int main() {
int T; scanf("%d", &T);
for (int tc = 1; tc <= T; ++tc) {
// 初始化、讀入、建圖
// 計算 maxDay = max(E_i)
// S=0, 任務 1..N, 日期 N+1..N+maxDay, T=N+maxDay+1
// 加邊
int flow = 0, sumP = 0;
while (bfs()) while (int f = dfs(0, INF)) flow += f;
printf("Case %d: %s\n\n", tc, flow == sumP ? "Yes" : "No");
}
}