每天需 ri 條毛巾。新買花費 c,快洗 d1 天花費 f1,慢洗 d2 天花費 f2。毛巾可重複使用。求滿足所有天數需求的最小總花費。
struct MCMF {
struct Edge { int to, cap, cost, rev; };
vector<vector minCostMaxFlow(int s, int t) {
int flow = 0, cost = 0;
vector dist, pv, pe;
while (true) {
dist.assign(g.size(), INF); pv.assign(g.size(), -1); pe.assign(g.size(), -1);
dist[s] = 0;
queue q; q.push(s);
vector inq(g.size()); inq[s] = true;
while (!q.empty()) {
int u = q.front(); q.pop(); inq[u] = false;
for (int i=0; i dist[u] + e.cost) {
dist[e.to] = dist[u] + e.cost;
pv[e.to] = u; pe[e.to] = i;
if (!inq[e.to]) { inq[e.to] = true; q.push(e.to); }
}
}
}
if (dist[t] == INF) break;
int f = INF;
for (int v=t; v!=s; v=pv[v]) f = min(f, g[pv[v]][pe[v]].cap);
for (int v=t; v!=s; v=pv[v]) {
Edge &e = g[pv[v]][pe[v]];
e.cap -= f; g[v][e.rev].cap += f;
}
flow += f; cost += f * dist[t];
}
return {flow, cost};
}
};
此題是「最小費用流建模」的教科書級案例,將資源重複使用、延遲可用、多種獲取途徑統一建模為網絡流。