Professional Documents
Culture Documents
com/pin3da/Programming-
contest/tree/master/solved/lightoj/1409%20-%20Rent%20a%20Car)
struct MCMF {
typedef long long ctype;
enum { MAXN = 1000, INF = INT_MAX };
struct Edge { int x, y; ctype cap, cost; };
vector<Edge> E; vector<int> adj[MAXN];
int N, prev[MAXN]; ctype dist[MAXN], phi[MAXN];
ctype z = INF;
for (x = t; x != s; x = E[prev[x]].x)
{ z = min(z, E[prev[x]].cap); }
for (x = t; x != s; x = E[prev[x]].x)
{ E[prev[x]].cap -= z; E[prev[x]^1].cap += z; }
flowVal += z;
flowCost += z * (dist[t] - phi[s] + phi[t]);
for (x = 0; x < N; x++)
{ if (prev[x] != -1) phi[x] += dist[x]; } // ***
}
return make_pair(flowVal, flowCost);
}
};
// i : day
// n + i : service
// 2 * n + i: supply
void solve() {
int n, c, r;
cin >> n >> c >> r;
vector<int> d(n);
int N = n + n + c;
int source = N;
int sink = source + 1;
int t, w;
MCMF g(N + 10);
for (int i = 0; i < n; ++i) {
cin >> t;
d[i] = t;
g.add(i, sink, t, 0); // each day must apport t to the flow.
g.add(source, n + i, d[i], 0); // each service has d[i] cars available (if
needed)
}
int main() {
ios_base::sync_with_stdio(false);cin.tie(NULL);
int tc;
cin >> tc;
for (int i = 0; i < tc; ++i) {
printf("Case %d: ", i + 1);
solve();
}
return 0;
}