typedeflonglong ll; constint N = 4e3 + 34, M = 2e4 + 42, INF = 0x3f3f3f3f; structedge { int to, next, w, c; } e[M << 1]; int head[N], cnt = 1; voidaddedge(int x, int y, int z, int w){ e[++cnt] = (edge){y, head[x], z, w}; head[x] = cnt; e[++cnt] = (edge){x, head[y], 0, -w}; head[y] = cnt; }
voidek(int s, int t, int& mflow, ll& mcost){ int dis[N], vis[N], flow[N], pre[N]; std::queue<int> q; mflow = mcost = 0; while (1) { memset(dis, 0x3f, sizeof dis); q.push(s); dis[s] = 0; flow[s] = INF; while (!q.empty()) { int pos = q.front(); vis[pos] = 0; q.pop(); for (int i = head[pos]; i; i = e[i].next) { int nx = e[i].to; if (e[i].w && dis[nx] > dis[pos] + e[i].c) { dis[nx] = dis[pos] + e[i].c; flow[nx] = std::min(flow[pos], e[i].w); pre[nx] = i; if (!vis[nx]) { vis[nx] = 1; q.push(nx); } } } } if (dis[t] == INF) return; for (int i = pre[t]; i; i = pre[e[i ^ 1].to]) { e[i].w -= flow[t]; e[i ^ 1].w += flow[t]; } mflow += flow[t]; mcost += dis[t] * flow[t]; } }
int n, x, a, b, c, d, _; ll y;
intmain(){ scanf("%d%d%d%d%d%d", &n, &a, &b, &c, &d, &_); for (int i = 1; i <= n; i++) { scanf("%d", &x); addedge(1, i + 2, x, 0); addedge(n + i + 2, 2, x, 0); } for (int i = 1; i <= n; i++) { addedge(1, i + n + 2, INF, a); if (i < n) addedge(i + 2, i + 3, INF, 0); if (i + b <= n) addedge(i + 2, i + n + b + 2, INF, c); if (i + d <= n) addedge(i + 2, i + n + d + 2, INF, _); } ek(1, 2, x, y); printf("%lld", y); }
typedeflonglong ll; constint N = 4e3 + 34, M = 2e4 + 42, INF = 0x3f3f3f3f; structedge { int to, next, w, c; } e[M << 1]; int head[N], cnt = 1; voidaddedge(int x, int y, int z, int w){ e[++cnt] = (edge){y, head[x], z, w}; head[x] = cnt; e[++cnt] = (edge){x, head[y], 0, -w}; head[y] = cnt; }
voidek(int s, int t, int& mflow, ll& mcost){ int dis[N], vis[N], flow[N], pre[N]; std::queue<int> q; mflow = mcost = 0; while (1) { memset(dis, 0x3f, sizeof dis); q.push(s); dis[s] = 0; flow[s] = INF; while (!q.empty()) { int pos = q.front(); vis[pos] = 0; q.pop(); for (int i = head[pos]; i; i = e[i].next) { int nx = e[i].to; if (e[i].w && dis[nx] > dis[pos] + e[i].c) { dis[nx] = dis[pos] + e[i].c; flow[nx] = std::min(flow[pos], e[i].w); pre[nx] = i; if (!vis[nx]) { vis[nx] = 1; q.push(nx); } } } } if (dis[t] == INF) return; for (int i = pre[t]; i; i = pre[e[i ^ 1].to]) { e[i].w -= flow[t]; e[i ^ 1].w += flow[t]; } mflow += flow[t]; mcost += dis[t] * flow[t]; } }
int n, x, a, b, c, d, _; ll y;
intmain(){ scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &x); addedge(1, i + 2, x, 0); addedge(n + i + 2, 2, x, 0); } scanf("%d%d%d%d%d", &a, &b, &c, &d, &_); for (int i = 1; i <= n; i++) { addedge(1, i + n + 2, INF, a); if (i < n) addedge(i + 2, i + 3, INF, 0); if (i + b <= n) addedge(i + 2, i + n + b + 2, INF, c); if (i + d <= n) addedge(i + 2, i + n + d + 2, INF, _); } ek(1, 2, x, y); printf("%lld", y); }
constint N = 1e3 + 31, M = 4e4 + 44, K = 55, INF = 0x3f3f3f3f; structedge { int to, next, w; } e[M << 1]; int head[N], cnt = 1; voidaddedge(int x, int y, int z){ e[++cnt] = (edge){y, head[x], z}, head[x] = cnt; e[++cnt] = (edge){x, head[y], 0}, head[y] = cnt; }
int lv[N]; intbfs(int s, int t){ memset(lv, 0, sizeof lv); std::queue<int> q; lv[s] = 1; q.push(s); while (!q.empty()) { int x = q.front(); q.pop(); for (int i = head[x]; i; i = e[i].next) { int nx = e[i].to; if (!e[i].w || lv[nx]) continue; lv[nx] = lv[x] + 1; q.push(nx); } } return lv[t]; } intdfs(int s, int t, int f){ if (s == t) return f; int r = 0; for (int i = head[s]; f && i; i = e[i].next) { int nx = e[i].to; if (!e[i].w || lv[nx] != lv[s] + 1) continue; int tmp = dfs(nx, t, std::min(f, e[i].w)); r += tmp, f -= tmp; e[i].w -= tmp, e[i ^ 1].w += tmp; } if (!r) lv[s] = 0; return r; } intdinic(int s, int t){ int ret = 0; while (bfs(s, t)) ret += dfs(s, t, INF); return ret; }
int par[K]; intf(int x){ return par[x] ? par[x] = f(par[x]) : x; } inlinevoidg(int x, int y){ if ((x = f(x)) != (y = f(y))) par[x] = y; }
int n, m, k, x, y, ans, c[K], h[K]; std::vector<int> v[K]; inlineintid(int t, int i){ return t * n + i + 1; } intmain(){ scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= m; i++) { for (scanf("%d%d", h + i, &x), c[i] = x; x--;) { scanf("%d", &y); v[i].push_back(y += 2); g(v[i].front(), v[i].back()); } } if (f(1) != f(2)) returnputs("0"), 0; n += 2; addedge(1, 3, k); for (int t = 1;; t++) { for (int i = 1; i <= n; i++) addedge(id(t - 1, i), id(t, i), INF); for (int j = 1; j <= m; j++) addedge(id(t - 1, v[j][(t - 1 + c[j]) % c[j]]), id(t, v[j][t % c[j]]), h[j]); if ((ans += dinic(1, id(t, 1))) == k) { return !printf("%d", t); } } }
structedge { int to, next, w; } e[M << 1]; int head[N], cnt = 1; voidaddedge(int x, int y, int z){ e[++cnt] = (edge){y, head[x], z}, head[x] = cnt; e[++cnt] = (edge){x, head[y], 0}, head[y] = cnt; }
int level[N]; boolbfs(int s, int t){ memset(level, 0, sizeof level); std::queue<int> q; level[s] = 1; q.push(s); while (!q.empty()) { int pos = q.front(); q.pop(); for (int i = head[pos]; i; i = e[i].next) { int nx = e[i].to; if (level[nx] || !e[i].w) continue; level[nx] = level[pos] + 1; q.push(nx); } } return level[t]; } intdfs(int s, int t, int flow){ if (s == t) return flow; int ret = 0; for (int i = head[s]; flow && i; i = e[i].next) { int nx = e[i].to; if (level[nx] == level[s] + 1 && e[i].w) { int tmp = dfs(nx, t, std::min(flow, e[i].w)); flow -= tmp; ret += tmp; e[i].w -= tmp; e[i ^ 1].w += tmp; } } return ret; } intdinic(int s, int t){ int ret = 0; while (bfs(s, t)) ret += dfs(s, t, 0x3f3f3f3f); return ret; }
int n, m, x, s, t, sum, f; char buf[' '];
intmain(){ scanf("%d%d", &n, &m); s = n + m + 1, t = n + m + 2; for (int i = 1; i <= n; i++) { scanf("%d", &x); addedge(s, i, x); sum += x; std::cin.getline(buf, ' '); for (int j = 0; ~sscanf(buf + j, "%d", &x); j++) { j += !x; addedge(i, n + x, 0x3f3f3f3f); for (j += !x; x; x /= 10) j++; } } for (int i = 1; i <= m; i++) { scanf("%d", &x); addedge(n + i, t, x); } sum -= dinic(s, t); int tmp = 0; for (int i = n; !tmp; i--) tmp = i * !!level[i]; for (int i = 1; i <= tmp; i++) { if (level[i]) printf("%d%c", i, " \n"[i == tmp]); } tmp = 0; for (int i = m; !tmp; i--) tmp = i * !!level[n + i]; for (int i = 1; i <= tmp; i++) { if (level[n + i]) printf("%d%c", i, " \n"[i == tmp]); } printf("%d", sum); }
constint N = 1e3 + 31, M = 3e4 + 43, K = 22, INF = 0x3f3f3f3f;
structedge { int to, next, w; } e[M << 1]; int head[N], cnt = 1; voidaddedge(int x, int y, int z){ e[++cnt] = (edge){y, head[x], z}; head[x] = cnt; e[++cnt] = (edge){x, head[y], 0}; head[y] = cnt; }
int level[N]; boolbfs(int s, int t){ memset(level, 0, sizeof level); std::queue<int> q; q.push(s); level[s] = 1; while (!q.empty()) { int pos = q.front(); q.pop(); for (int i = head[pos]; i; i = e[i].next) { int nx = e[i].to; if (level[nx] || !e[i].w) continue; level[nx] = level[pos] + 1; q.push(nx); } } return level[t]; }
intdfs(int s, int t, int flow){ if (s == t) return flow; int ret = 0; for (int i = head[s]; flow && i; i = e[i].next) { int nx = e[i].to; if (level[s] + 1 == level[nx] && e[i].w) { int tmp = dfs(nx, t, std::min(flow, e[i].w)); e[i].w -= tmp; e[i ^ 1].w += tmp; ret += tmp; flow -= tmp; } } return ret; }
intdinic(int s, int t){ int ret = 0; while (bfs(s, t)) ret += dfs(s, t, INF); return ret; }
std::queue<int> out[K]; int n, k, x, y, sum; intmain(){ scanf("%d%d", &k, &n); for (int i = 1; i <= k; i++) { scanf("%d", &x); addedge(n + i + 1, n + k + 2, x); sum += x; } for (int i = 1; i <= n; i++) { addedge(1, i + 1, 1); for (scanf("%d", &x); x--;) { scanf("%d", &y); addedge(i + 1, n + y + 1, 1); } } if (dinic(1, n + k + 2) != sum) returnputs("No Solution!"), 0; for (int i = 1; i <= n; i++) { for (int j = head[i + 1]; j; j = e[j].next) { if ((~j & 1) && !e[j].w) { out[e[j].to - n - 1].push(i); break; } } } for (int i = 1; i <= k; i++) { printf("%d: ", i); if (out[i].empty()) puts(""); while (!out[i].empty()) { printf("%d%c", out[i].front(), " \n"[out[i].size() == 1]); out[i].pop(); } } }
constint N = 4e2 + 24, M = 6e3 + 36, INF = 0x3f3f3f3f;
structedge { int to, next, w; } e[M << 2]; int head[N], cnt = 1; voidaddedge(int x, int y, int z){ e[++cnt] = (edge){y, head[x], z}; head[x] = cnt; e[++cnt] = (edge){x, head[y], 0}; head[y] = cnt; }
int level[N]; boolbfs(int s, int t){ memset(level, 0, sizeof level); std::queue<int> q; q.push(s); level[s] = 1; while (!q.empty()) { int pos = q.front(); q.pop(); for (int i = head[pos]; i; i = e[i].next) { int nx = e[i].to; if (level[nx] || !e[i].w) continue; level[nx] = level[pos] + 1; q.push(nx); } } return level[t]; }
intdfs(int s, int t, int flow){ if (s == t) return flow; int ret = 0; for (int i = head[s]; flow && i; i = e[i].next) { int nx = e[i].to; if (level[nx] == level[s] + 1 && e[i].w) { int tmp = dfs(nx, t, std::min(flow, e[i].w)); e[i].w -= tmp; e[i ^ 1].w += tmp; ret += tmp; flow -= tmp; } } if (!ret) level[s] = 0; return ret; }
intdinic(int s, int t){ int ret = 0; while (bfs(s, t)) ret += dfs(s, t, INF); return ret; }
bool vis[N]; voiddfs(int x){ if (vis[x]) return; printf("%d ", x >> 1); vis[x] = 1; for (int i = head[x]; i; i = e[i].next) { if (!e[i].w && (~i & 1)) return dfs(e[i].to - 1); } }
int n, m, x, y; intmain(){ for (scanf("%d%d", &n, &m); m--;) { scanf("%d%d", &x, &y); addedge(2 * x, 2 * y + 1, 1); } for (int i = 1; i <= n; i++) { addedge(1, 2 * i, 1); addedge(2 * i + 1, 2 * n + 2, 1); } x = dinic(1, 2 * n + 2); vis[2 * n + 2] = 1; for (int i = 1; i <= n; i++) { if (!vis[2 * i]) { dfs(2 * i); puts(""); } } printf("%d", n - x); }
constint N = 1e3 + 31, M = 2e5 + 52, INF = 0x3f3f3f3f; structedge { int to, next, w; } e[M << 1]; int head[N], cnt = 1; voidaddedge(int x, int y, int z){ e[++cnt] = (edge){y, head[x], z}, head[x] = cnt; e[++cnt] = (edge){x, head[y], 0}, head[y] = cnt; }
int lv[N]; boolbfs(int s, int t){ memset(lv, 0, sizeof lv); std::queue<int> q; q.push(s); lv[s] = 1; while (!q.empty()) { int x = q.front(); q.pop(); for (int i = head[x]; i; i = e[i].next) { int nx = e[i].to; if (lv[nx] || !e[i].w) continue; lv[nx] = lv[x] + 1; q.push(nx); } } return lv[t]; } intdfs(int s, int t, int f){ if (s == t) return f; int r = 0; for (int i = head[s]; f && i; i = e[i].next) { int nx = e[i].to; if (lv[nx] != lv[s] + 1 || !e[i].w) continue; int tmp = dfs(nx, t, std::min(f, e[i].w)); f -= tmp; r += tmp; e[i].w -= tmp; e[i ^ 1].w += tmp; } return r; } intdinic(int s, int t){ int ret = 0; while (bfs(s, t)) ret += dfs(s, t, INF); return ret; }
#define X(x) ((x) + 2) #define Y(x) ((x) + n + 2)
int n, len, ans, a[N], dp[N]; intmain(){ scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", a + i); } for (int i = 1; i <= n; len = std::max(len, dp[i++])) { for (int j = 0; j < i; j++) { if (a[j] <= a[i]) dp[i] = std::max(dp[i], dp[j] + 1); } } printf("%d\n", len); for (int i = 1; i <= n; i++) { addedge(X(i), Y(i), 1); if (dp[i] == 1) addedge(1, X(i), 1); if (dp[i] == len) addedge(Y(i), 2, 1); for (int j = 1; j < i; j++) if (a[j] <= a[i] && dp[j] + 1 == dp[i]) addedge(Y(j), X(i), 1); } printf("%d\n", ans = dinic(1, 2)); addedge(1, X(1), INF), addedge(X(1), Y(1), INF); if (dp[n] == len && n != 1) addedge(Y(n), 2, INF), addedge(X(n), Y(n), INF); printf("%d", ans + dinic(1, 2)); }
structedge { int to, next, w; } e[M << 1]; int head[N], cnt = 1; voidaddedge(int x, int y, int z){ e[++cnt] = (edge){y, head[x], z}; head[x] = cnt; e[++cnt] = (edge){x, head[y], 0}; head[y] = cnt; }
int level[N]; boolbfs(int s, int t){ memset(level, 0, sizeof level); std::queue<int> q; level[s] = 1; q.push(s); while (!q.empty()) { int pos = q.front(); q.pop(); for (int i = head[pos]; i; i = e[i].next) { int nx = e[i].to; if (!e[i].w || level[nx]) continue; level[nx] = level[pos] + 1; q.push(nx); } } return level[t]; }
intdfs(int s, int t, int flow){ if (s == t) return flow; int ret = 0; for (int i = head[s]; flow && i; i = e[i].next) { int nx = e[i].to; if (level[nx] == level[s] + 1 && e[i].w) { int tmp = dfs(nx, t, std::min(flow, e[i].w)); e[i].w -= tmp; e[i ^ 1].w += tmp; flow -= tmp; ret += tmp; } } if (!ret) level[s] = 0; return ret; }
intdinic(int s, int t){ int ret = 0; while (bfs(s, t)) ret += dfs(s, t, INF); return ret; }
int n; intid(int x, int y){ return (x - 1) * n + y + 2; }
int m, x, y, _[K][K]; intmain(){ scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) { scanf("%d%d", &x, &y); _[x][y] = 1; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (_[i][j]) continue; if (~(i + j) & 1) { addedge(id(i, j), 2, 1); continue; } addedge(1, id(i, j), 1); for (int k = 0; k < 8; k++) { int nx = i + dir[k][0], ny = j + dir[k][1]; if (nx < 1 || ny < 1 || nx > n || ny > n || _[nx][ny]) continue; addedge(id(i, j), id(nx, ny), 1); } } } printf("%d", n * n - m - dinic(1, 2)); }
int n, m, p, k, a, b, c, d, e_, lv, x, y, ans = INF; int key[N][N], wall[N][N][4], vis[M][N][N]; std::queue<t4> q; intmain(){ for (scanf("%d%d%d%d", &n, &m, &p, &k); k--;) { scanf("%d%d%d%d%d", &a, &b, &c, &d, &e_); if (!e_--) e_ = 11; for (int i = 0; i < 4; i++) { if (c == a + dir[i][0] && d == b + dir[i][1]) { wall[a][b][i] = 1 << e_; wall[c][d][i ^ 1] = 1 << e_; continue; } } } for (scanf("%d", &k); k--; key[a][b] |= 1 << (c - 1)) scanf("%d%d%d", &a, &b, &c); q.emplace(0, 1, 1, key[1][1]); while (!q.empty()) { std::tie(lv, x, y, d) = q.front(), q.pop(); if (x == n && y == m) return !printf("%d", d); for (int i = 0; i < 4; i++) { if ((wall[x][y][i] & lv) != wall[x][y][i]) continue; int nx = x + dir[i][0], ny = y + dir[i][1], nlv = lv | key[nx][ny]; if (nx < 1 || ny < 1 || nx > n || ny > m) continue; if (!vis[nlv][nx][ny]) { vis[nlv][nx][ny] = 1; q.emplace(nlv, nx, ny, d + 1); } } } puts("-1"); }
structedge { int to, next, w, c; } e[N * N * 4]; int head[N], cnt; voidaddedge(int x, int y, int z, int w){ e[++cnt] = (edge){y, head[x], z, w}; head[x] = cnt; e[++cnt] = (edge){x, head[y], 0, -w}; head[y] = cnt; }
voidek(int s, int t, int &mflow, int &mcost){ staticint dis[N], vis[N], flow[N], pre[N]; std::queue<int> q; mflow = mcost = 0; while (1) { memset(dis, 0x3f, sizeof dis); q.push(s); flow[s] = 0x3f3f3f3f; dis[s] = 0; while (!q.empty()) { int pos = q.front(); vis[pos] = 0; q.pop(); for (int i = head[pos]; i; i = e[i].next) { int nx = e[i].to; if (e[i].w && dis[nx] > dis[pos] + e[i].c) { dis[nx] = dis[pos] + e[i].c; flow[nx] = std::min(flow[pos], e[i].w); pre[nx] = i; if (!vis[nx]) { q.push(nx); vis[nx] = 1; } } } } if (dis[t] == 0x3f3f3f3f) return; for (int i = pre[t]; i; i = pre[e[i ^ 1].to]) { e[i].w -= flow[t]; e[i ^ 1].w += flow[t]; } mflow += flow[t]; mcost += dis[t] * flow[t]; } }
int n, m, a[N], b[N], c[N][N]; voidbuild(int off){ memset(head, 0, sizeof head); cnt = 1; for (int i = 1; i <= n; i++) { addedge(1, i + 1, a[i], 0); for (int j = 1; j <= m; j++) { addedge(i + 1, j + n + 1, INF, c[i][j] * off); } } for (int i = 1; i <= m; i++) { addedge(i + n + 1, n + m + 2, b[i], 0); } }
int x, y; intmain(){ scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { scanf("%d", a + i); } for (int i = 1; i <= m; i++) { scanf("%d", b + i); } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { scanf("%d", c[i] + j); } } build(1); ek(1, n + m + 2, x, y); printf("%d\n", y); build(-1); ek(1, n + m + 2, x, y); printf("%d", -y); }