M 台機器,N 個任務。任務 i 需在 [S_i, E_i] 內處理 P_i 天,可中斷、可換機器。每天每台機器只能做一任務,每任務每天只能佔一機器。問是否存在可行調度。N≤500, M≤200, 時間≤500。
S → 任務節點 i,容量 P_i(總需處理天數)。i → 時間節點 t (S_i ≤ t ≤ E_i),容量 1(每天最多佔 1 機器)。t → 匯點 T,容量 M(每天最多 M 台機器)。P_i 則可行。struct Edge { int to, next, cap, flow; } e[520010];
int head[1010], gap[1010], dis[1010], cur[1010], S[1010];
void addEdge(int u,int v,int c) { ... } // 前向+反向邊
void bfs(int s, int t) { ... } // 反向 BFS 計算距離標號
int maxFlow(int s, int t, int n) {
bfs(s,t);
if (dis[s]==-1) return 0;
memcpy(cur,head,sizeof(head));
int u=s, top=0, flow=0;
while (dis[s] < n) {
// 尋找可推進邊
// 更新距離標號、gap 優化
// 增廣並回溯
}
return flow;
}
1 (S) + N + 500 (時間) + 1 (T) ≤ 1002。N + N*500 + 500 ≤ 250k,雙向 500k,數組開足。N,避免衝突。HDU 3572 是「任務調度 → 最大流」的經典建模。關鍵在於將「時間」作為中間層節點,容量限制對應資源約束。ISAP 算法配合 Gap 優化、當前弧優化,能高效解決此類大規模二分圖流問題。