voidadd_edge(int u, int v, int w) { edge[++cnt].to = v; edge[cnt].w = w; edge[cnt].nex = head[u]; head[u] = cnt; }
intdfs(int u, int dist) { if (u == t) return dist; for (int &i = cur[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && d[v] == d[u] + 1) { int di = dfs(v, min(dist, w)); if (di > 0) { edge[i].w -= di; edge[i ^ 1].w += di; return di; } } } return0; }
intbfs() { while (!q.empty()) q.pop(); memset(d, 0, sizeof(d)); d[s] = 1; q.push(s); while (!q.empty()) { int u = q.front(); q.pop(); for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && 0 == d[v]) { d[v] = d[u] + 1; q.push(v); } } } if (d[t] > 0) return1; return0; }
intdinic() { int res = 0; while (bfs()) { for (int i = 1; i <= t; i++) cur[i] = head[i]; while (int d = dfs(s, INF)) res += d; } return res; }
intmain() { init(); scanf("%d%d", &m, &n); int sum = 0; s = n + m + 1, t = n + m + 2; for (int i = 1; i <= m; i++) { int x; scanf("%d", &x); sum += x; add_edge(s, i, x); add_edge(i, s, 0); } for (int i = 1; i <= n; i++) { int x; scanf("%d", &x); add_edge(m + i, t, x); add_edge(t, m + i, 0); } for (int i = 1; i <= m; i++) { for (int k = m + 1; k <= m + n; k++) { add_edge(i, k, 1); add_edge(k, i, 0); } } int res = dinic(); if (res != sum) { printf("0\n"); return0; } printf("1\n"); for (int u = 1; u <= m; u++) { for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (v != s && 0 == w) printf("%d ", v - m); } printf("\n"); } return0; }
voidadd_edge(int u, int v, int w) { edge[++cnt].to = v; edge[cnt].w = w; edge[cnt].nex = head[u]; head[u] = cnt; }
intdfs(int u, int dist) { if (u == t) return dist; for (int &i = cur[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && d[v] == d[u] + 1) { int di = dfs(v, min(dist, w)); if (di > 0) { edge[i].w -= di; edge[i ^ 1].w += di; return di; } } } return0; }
intbfs() { while (!q.empty()) q.pop(); memset(d, 0, sizeof(d)); d[s] = 1; q.push(s); while (!q.empty()) { int u = q.front(); q.pop(); for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && 0 == d[v]) { d[v] = d[u] + 1; q.push(v); } } } if (d[t] > 0) return1; return0; }
intdinic() { int res = 0; while (bfs()) { for (int i = 1; i <= t; i++) cur[i] = head[i]; while (int d = dfs(s, INF)) res += d; } return res; }
intmain() { init(); scanf("%d%d", &m, &n); s = n + m + 1, t = s + 1; int u, v; while (scanf("%d%d", &u, &v) && -1 != u && -1 != v) { add_edge(u, v, 1); add_edge(v, u, 0); } for (int i = 1; i <= m; i++) { add_edge(s, i, 1); add_edge(i, s, 0); } for (int i = m + 1; i <= n + m; i++) { add_edge(i, t, 1); add_edge(t, i, 0); } int res = dinic(); printf("%d\n", res); for (int u = 1; u <= m; u++) { for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (v == s) continue; if (0 == w) printf("%d %d\n", u, v); } } return0; }
voidadd_edge(int u, int v, int w) { edge[++cnt].to = v; edge[cnt].w = w; edge[cnt].nex = head[u]; head[u] = cnt; }
intdfs(int u, int dist) { if (u == t) return dist; for (int &i = cur[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && d[v] == d[u] + 1) { int di = dfs(v, min(dist, w)); if (di > 0) { edge[i].w -= di; edge[i ^ 1].w += di; return di; } } } return0; }
intbfs() { while (!q.empty()) q.pop(); memset(d, 0, sizeof(d)); d[s] = 1; q.push(s); while (!q.empty()) { int u = q.front(); q.pop(); for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && 0 == d[v]) { d[v] = d[u] + 1; q.push(v); } } } if (d[t] > 0) return1; return0; }
intdinic() { int res = 0; while (bfs()) { for (int i = 0; i < N; i++) cur[i] = head[i]; while (int d = dfs(s, INF)) res += d; } return res; }
voidinsert(int u, int v, int w) { add_edge(u, v, w); add_edge(v, u, 0); }
intmain() { init(); scanf("%d%d%d", &n, &m, &k); n += 2; for (int i = 1; i <= m; i++) { scanf("%d%d", &h[i], &r[i]); for (int j = 0; j < r[i]; j++) { scanf("%d", &sp[i][j]); sp[i][j] += 2; } } s = N - 2, t = N - 1; int sum = 0, res = 0; while (res < 500) { insert(s, res * n + 2, INF); insert(res * n + 1, t, INF); if (0 != res) { for (int i = 1; i <= n; i++) insert((res - 1) * n + i, res * n + i, INF); for (int i = 1; i <= m; i++) { int x = sp[i][(res - 1) % r[i]]; int y = sp[i][res % r[i]]; insert((res - 1) * n + x, res * n + y, h[i]); } } sum += dinic(); if (sum >= k) break; res++; } printf("%d\n", 500 == res ? 0 : res); return0; }
voidadd_edge(int u, int v, int w) { edge[++cnt].to = v; edge[cnt].w = w; edge[cnt].nex = head[u]; head[u] = cnt; }
intdfs(int u, int dist) { if (u == t) return dist; for (int &i = cur[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && d[v] == d[u] + 1) { int di = dfs(v, min(dist, w)); if (di > 0) { edge[i].w -= di; edge[i ^ 1].w += di; return di; } } } return0; }
intbfs() { while (!q.empty()) q.pop(); memset(d, 0, sizeof(d)); d[s] = 1; q.push(s); while (!q.empty()) { int u = q.front(); q.pop(); for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && 0 == d[v]) { d[v] = d[u] + 1; q.push(v); } } } if (d[t] > 0) return1; return0; }
intdinic() { int res = 0; while (bfs()) { for (int i = 1; i <= t; i++) cur[i] = head[i]; while (int d = dfs(s, INF)) res += d; } return res; }
voidinsert(int u, int v, int w) { add_edge(u, v, w); add_edge(v, u, 0); }
intmain() { scanf("%d", &T); while (T--) { init(); scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { int k, x; scanf("%d", &k); while (k--) { scanf("%d", &x); c[i][x]++; } } s = 1, t = n + m + 1; for (int i = 1; i <= m; i++) { if (0 == c[1][i]) continue; insert(s, i + n, c[1][i]); } for (int i = 1; i <= m; i++) insert(i + n, t, 1); for (int i = 2; i <= n; i++) { for (int k = 1; k <= m; k++) { if (0 == c[i][k]) { insert(k + n, i, 1); continue; } if (1 == c[i][k]) continue; insert(i, k + n, c[i][k] - 1); } } int res = dinic(); printf("Case #%d: %d\n", ++icas, res); } return0; }
voidadd_edge(int u, int v, int w) { edge[++cnt].to = v; edge[cnt].w = w; edge[cnt].nex = head[u]; head[u] = cnt; }
intdfs(int u, int dist) { if (u == t) return dist; for (int &i = cur[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && d[v] == d[u] + 1) { int di = dfs(v, min(dist, w)); if (di > 0) { edge[i].w -= di; edge[i ^ 1].w += di; return di; } } } return0; }
intbfs() { while (!q.empty()) q.pop(); memset(d, 0, sizeof(d)); d[s] = 1; q.push(s); while (!q.empty()) { int u = q.front(); q.pop(); for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && 0 == d[v]) { d[v] = d[u] + 1; q.push(v); } } } if (d[t] > 0) return1; return0; }
intdinic() { int res = 0; while (bfs()) { for (int i = 1; i <= t; i++) cur[i] = head[i]; while (int d = dfs(s, INF)) res += d; } return res; }
voidinsert(int u, int v, int w) { add_edge(u, v, w); add_edge(v, u, 0); }
intmain() { init(); scanf("%d%d", &n, &m); s = n * m + 1, t = s + 1; int sum = 0; for (int i = 1; i <= n; i++) { for (int k = 1; k <= m; k++) { scanf("%d", &c[i][k]); sum += c[i][k]; int p = (i - 1) * m + k; if (0 == (i + k) % 2) insert(s, p, c[i][k]); elseinsert(p, t, c[i][k]); } } for (int i = 1; i <= n; i++) { for (int k = 1; k <= m; k++) { int p = (i - 1) * m + k; if (1 == (i + k) % 2) continue; for (int j = 0; j < 4; j++) { int x = i + dx[j], y = k + dy[j]; if (x < 1 || x > n || y < 1 || y > m) continue; insert(p, (x - 1) * m + y, INF); } } } int res = dinic(); printf("%d\n", sum - res); return0; }
voidadd_edge(int u, int v, int w) { edge[++cnt].to = v; edge[cnt].w = w; edge[cnt].nex = head[u]; head[u] = cnt; }
intdfs(int u, int dist) { if (u == t) return dist; for (int &i = cur[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && d[v] == d[u] + 1) { int di = dfs(v, min(dist, w)); if (di > 0) { edge[i].w -= di; edge[i ^ 1].w += di; return di; } } } return0; }
intbfs() { while (!q.empty()) q.pop(); memset(d, 0, sizeof(d)); d[s] = 1; q.push(s); while (!q.empty()) { int u = q.front(); q.pop(); for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && 0 == d[v]) { d[v] = d[u] + 1; q.push(v); } } } if (d[t] > 0) return1; return0; }
intdinic() { int res = 0; while (bfs()) { for (int i = 1; i <= t; i++) cur[i] = head[i]; while (int d = dfs(s, INF)) res += d; } return res; }
voidinsert(int u, int v, int w) { add_edge(u, v, w); add_edge(v, u, 0); }
boolcheck(int a, int b) { int c = a * a + b * b, sq = (int)sqrt(c); if (sq * sq == c && 1 == gcd(a, b)) returntrue; returnfalse; }
intmain() { init(); scanf("%d", &n); s = n + 1, t = s + 1; int sum = 0; for (int i = 1; i <= n; i++) { scanf("%d", &c[i]); sum += c[i]; if (c[i] & 1) insert(s, i, c[i]); elseinsert(i, t, c[i]); } for (int i = 1; i <= n; i++) { for (int k = i + 1; k <= n; k++) { if (c[i] % 2 == c[k] % 2) continue; if (check(c[i], c[k])) { if (1 == c[i] % 2) insert(i, k, INF); elseinsert(k, i, INF); } } } int res = dinic(); printf("%d\n", sum - res); return0; }
voidadd_edge(int u, int v, int w) { edge[++cnt].to = v; edge[cnt].u = u; edge[cnt].w = w; edge[cnt].nex = head[u]; head[u] = cnt; }
intdfs(int u, int dist) { if (u == t) return dist; for (int &i = cur[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && d[v] == d[u] + 1) { int di = dfs(v, min(dist, w)); if (di > 0) { edge[i].w -= di; edge[i ^ 1].w += di; return di; } } } return0; }
intbfs() { while (!q.empty()) q.pop(); memset(d, 0, sizeof(d)); d[s] = 1; q.push(s); while (!q.empty()) { int u = q.front(); q.pop(); for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && 0 == d[v]) { d[v] = d[u] + 1; q.push(v); } } } if (d[t] > 0) return1; return0; }
intdinic() { int res = 0; while (bfs()) { for (int i = 1; i <= n; i++) cur[i] = head[i]; while (int d = dfs(s, INF)) res += d; } return res; }
voidinsert(int u, int v, int w) { add_edge(u, v, w); add_edge(v, u, 0); }
voidtarjan(int u) { st[++top] = u; vis[u] = 1; dfn[u] = low[u] = ++tim; for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (0 == w) continue; if (0 == dfn[v]) { tarjan(v); low[u] = min(low[u], low[v]); } elseif (vis[v]) { low[u] = min(low[u], dfn[v]); } } if (low[u] == dfn[u]) { int v = 0; csc++; while (v != u) { v = st[top--]; scc[v] = csc; vis[v] = 0; } } }
intmain() { init(); scanf("%d%d%d%d", &n, &m, &s, &t); for (int i = 1; i <= m; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); insert(u, v, w); } int res = dinic(); for (int i = 1; i <= n; i++) if (0 == dfn[i]) tarjan(i); for (int i = 0; i <= cnt; i += 2) { if (edge[i].w) { printf("0 0\n"); continue; } printf("%d ", scc[edge[i].u] != scc[edge[i].to]); printf("%d\n", scc[edge[i].u] == scc[s] && scc[edge[i].to] == scc[t]); } return0; }
voidadd_edge(int u, int v, ll w) { edge[++cnt].to = v; edge[cnt].w = w; edge[cnt].nex = head[u]; head[u] = cnt; }
ll dfs(int u, ll dist) { if (u == t) return dist; for (int &i = cur[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to; ll w = edge[i].w; if (w > 0 && d[v] == d[u] + 1) { ll di = dfs(v, min(dist, w)); if (di > 0) { edge[i].w -= di; edge[i ^ 1].w += di; return di; } } } return0; }
intbfs(){ while (!q.empty()) q.pop(); memset(d, 0, sizeof(d)); d[s] = 1; q.push(s); while (!q.empty()) { int u = q.front(); q.pop(); for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to; ll w = edge[i].w; if (w > 0 && 0 == d[v]) { d[v] = d[u] + 1; q.push(v); } } } if (d[t] > 0) return1; return0; }
voiddinic() { ll res = 0; while (bfs()) { for (int i = 1; i <= t; i++) cur[i] = head[i]; while (ll d = dfs(s, INF)) res += d; } }
voidinsert(int u, int v, ll w) { add_edge(u, v, w); add_edge(v, u, 0); }
voidsolve(int u) { vis[u] = 1; for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to; ll w = edge[i].w; if (w > 0 && 0 == vis[v] && v != s && v != t) solve(v); } }
intmain() { init(); scanf("%d%d", &n, &m); s = n + 1, t = s + 1; ll sum = 0; for (int i = 1; i <= n; i++) { scanf("%lld", &val[i]); if (val[i] >= 0) { insert(s, i, val[i]); sum += val[i]; } elseinsert(i, t, -val[i]); } for (int i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); insert(u, v, INF); } dinic(); solve(s); int tot = 0; ll res = 0; for (int i = 1; i <= n; i++) { if (vis[i]) { tot++; res += val[i]; } } printf("%d %lld\n", tot, res); return0; }
voidadd_edge(int u, int v, int w) { edge[++cnt].to = v; edge[cnt].w = w; edge[cnt].nex = head[u]; head[u] = cnt; }
intdfs(int u, int dist) { if (u == t) return dist; for (int &i = cur[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && d[v] == d[u] + 1) { int di = dfs(v, min(dist, w)); if (di > 0) { edge[i].w -= di; edge[i ^ 1].w += di; return di; } } } return0; }
intbfs() { while (!qt.empty()) qt.pop(); memset(d, 0, sizeof(d)); d[s] = 1; qt.push(s); while (!qt.empty()) { int u = qt.front(); qt.pop(); for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && 0 == d[v]) { d[v] = d[u] + 1; qt.push(v); } } } if (d[t] > 0) return1; return0; }
intdinic() { int res = 0; while (bfs()) { for (int i = 1; i <= t; i++) cur[i] = head[i]; while (int d = dfs(s, INF)) res += d; } return res; }
voidinsert(int u, int v, int w) { add_edge(u, v, w); add_edge(v, u, 0); }
intmain() { init(); scanf("%d%d%d%d", &p, &q, &r, &D); int sum = 0; for (int z = 1; z <= r; z++) { for (int x = 1; x <= p; x++) { for (int y = 1; y <= q; y++) { id[x][y][z] = ++tot; scanf("%d", &c[x][y][z]); sum += c[x][y][z]; } } } s = tot + 1, t = s + 1; for (int x = 1; x <= p; x++) { for (int y = 1; y <= q; y++) { insert(s, id[x][y][1], INF); insert(id[x][y][r], t, c[x][y][r]); } } for (int z = 1; z <= r - 1; z++) { for (int x = 1; x <= p; x++) { for (int y = 1; y <= q; y++) { insert(id[x][y][z], id[x][y][z + 1], c[x][y][z]); } } } for (int x = 1; x <= p; x++) { for (int y = 1; y <= q; y++) { for (int z = D + 1; z <= r; z++) { for (int k = 0; k < 4; k++) { int nx = x + dx[k], ny = y + dy[k]; if (nx < 1 || ny < 1 || nx > p || ny > q) continue; insert(id[x][y][z], id[nx][ny][z - D], INF); } } } } int res = dinic(); printf("%d\n", res); return0; }
voidadd_edge(int u, int v, int w, int c) { edge[++cnt].to = v; edge[cnt].w = w; edge[cnt].c = c; edge[cnt].nex = head[u]; head[u] = cnt; }
intspfa(int s, int t) { memset(dis, INF, sizeof(dis)); memset(f, INF, sizeof(f)); memset(inq, 0, sizeof(inq)); while (!q.empty()) q.pop(); q.push(s); inq[s] = 1, dis[s] = 0, pre[t] = -1; while (!q.empty()) { int u = q.front(); q.pop(); inq[u] = 0; for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w, c = edge[i].c; if (0 == w || dis[v] <= dis[u] + c) continue; dis[v] = dis[u] + c; pre[v] = u; lst[v] = i; f[v] = min(f[u], w); if (1 == inq[v]) continue; inq[v] = 1; q.push(v); } } if (-1 == pre[t]) return0; return1; }
voidmcmf() { while (spfa(s, t)) { mf += f[t]; mc += f[t] * dis[t]; int now = t; while (now != s) { edge[lst[now]].w -= f[t]; edge[lst[now] ^ 1].w += f[t]; now = pre[now]; } } }
voidinsert(int u, int v, int w, int c) { add_edge(u, v, w, c); add_edge(v, u, 0, -c); }
voidsolve(int k) { init(); for (int i = 1; i <= n; i++) insert(s, i, a[i], 0); for (int i = 1; i <= m; i++) insert(n + i, t, b[i], 0); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) insert(i, n + j, INF, k * c[i][j]); mcmf(); }
intmain() { scanf("%d%d", &n, &m); s = n + m + 1, t = s + 1; 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]); solve(1); printf("%d\n", mc); solve(-1); printf("%d\n", -mc); return0; }
voidadd_edge(int u, int v, ll w, ll c) { edge[++cnt].to = v; edge[cnt].w = w; edge[cnt].c = c; edge[cnt].nex = head[u]; head[u] = cnt; }
intspfa(int s, int t) { for (int i = 0; i < N; i++) { dis[i] = f[i] = INF; inq[i] = 0; } while (!q.empty()) q.pop(); q.push(s); inq[s] = 1, dis[s] = 0, pre[t] = -1; while (!q.empty()) { int u = q.front(); q.pop(); inq[u] = 0; for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to; ll c = edge[i].c, w = edge[i].w; if (0 == w || dis[v] <= dis[u] + c) continue; dis[v] = dis[u] + c; pre[v] = u; lst[v] = i; f[v] = min(f[u], w); if (1 == inq[v]) continue; inq[v] = 1; q.push(v); } } if (-1 == pre[t]) return0; return1; }
voidmcmf() { while (spfa(s, t)) { mf += f[t]; mc += dis[t] * f[t]; int now = t; while (now != s) { edge[lst[now]].w -= f[t]; edge[lst[now] ^ 1].w += f[t]; now = pre[now]; } } }
voidinsert(int u, int v, ll w, ll c) { add_edge(u, v, w, c); add_edge(v, u, 0, -c); }
intmain() { init(); scanf("%d", &n); s = 2 * n + 1, t = s + 1; for (int i = 1; i <= n; i++) { ll x; scanf("%lld", &x); insert(s, i, x, 0); insert(n + i, t, x, 0); } ll pp, ff, ss; int mm, nn; scanf("%lld%d%lld%d%lld", &pp, &mm, &ff, &nn, &ss); for (int i = 1; i <= n; i++) { insert(s, n + i, INF, pp); if (i + 1 <= n) insert(i, i + 1, INF, 0); if (i + mm <= n) insert(i, i + mm + n, INF, ff); if (i + nn <= n) insert(i, i + nn + n, INF, ss); } mcmf(); printf("%lld\n", mc); return0; }