int main() { int n, m, s, t, kase = 0; while(scanf("%d%d%d%d", &n, &s, &t, &m) == 4 && n) { g.init(n); while(m--) { int u, v, c; scanf("%d%d%d", &u, &v, &c); u--; v--; g.AddEdge(u, v, c); g.AddEdge(v, u, c); } printf("Network %d\nThe bandwidth is %d.\n\n", ++kase, g.Maxflow(s-1, t-1)); } return 0; }
int main() { int N, M; scanf("%d %d", &N, &M); EdmondsKarp ek; ek.init(N + M + 2); int s = N + M; int t = s + 1; for (int i = 0; i < N; ++i) { ek.AddEdge(s, i, 1); } for (int i = 0; i < M; ++i) { ek.AddEdge(N + i, t, 1); } for (int i = 0; i < N; ++i) { int s; scanf("%d", &s); for (int j = 0; j < s; ++j) { int v; scanf("%d", &v); ek.AddEdge(i, N + v - 1, 1); } } printf("%d\n", ek.Maxflow(s, t)); return 0; }
int main() { int T; cin >> T; while(T--) { names.clear(); string s1, s2; cin >> n; for(int i = 0; i < n; i++) { cin >> s1; target[i] = ID(s1); } cin >> m; for(int i = 0; i < m; i++) { cin >> s1 >> s2; device[i] = ID(s2); } cin >> k; for(int i = 0; i < k; i++) { cin >> s1 >> s2; from[i] = ID(s1); to[i] = ID(s2); } int V = names.size(); g.init(V+2); for(int i = 0; i < m; i++) g.AddEdge(V, device[i], 1); // 源点->设备 for(int i = 0; i < n; i++) g.AddEdge(target[i], V+1, 1); // 插座->汇点 for(int i = 0; i < k; i++) g.AddEdge(from[i], to[i], INF); // 插头->插头 int r = g.Maxflow(V, V+1); cout << m-r << "\n"; if(T) cout << "\n"; } return 0; }
bool ok(int f) { EdmondsKarp mf; mf.init(2 * n + 2); int s = 2 * n, t = 2 * n + 1; for(int i = 0; i < n; i++) { if(v[i] > 0) { mf.addEdge(s, i << 1, v[i]); mf.addEdge(i << 1, (i << 1) | 1, v[i]); if(border[i]) { mf.addEdge(i << 1, t, f); } else { mf.addEdge(i << 1, t, 1); } for(int j = 0; j < n; j++) { if(mat[i][j] == 'Y' && v[j] > 0) mf.addEdge((i << 1) | 1, j << 1, v[i]); } } } int flow = mf.maxFlow(s, t); return flow == vn - bn + bn * f; }
int main() { int n, m, u, v, c, b, d; while(scanf("%d", &n) == 1 && n) { g.init(2*n+2); // 拆点 for(int i = 1; i <= n; i++) { scanf("%d", &c); g.AddEdge(i*2, i*2+1, c); } scanf("%d", &m); while(m--) { scanf("%d%d%d", &u, &v, &c); g.AddEdge(u*2+1, v*2, c); } scanf("%d%d", &b, &d); while(b--) { scanf("%d", &u); g.AddEdge(0, u*2, INF); } while(d--) { scanf("%d", &u); g.AddEdge(u*2+1, 1, INF); } printf("%d\n", g.Maxflow(0, 1)); } return 0; }
int main() { int tc; scanf("%d", &tc); while(tc--) { memset(board, 0, sizeof board); scanf("%d %d", &m, &n); int p; scanf("%d", &p); for(int i = 0; i < p; i++) { int x, y; scanf("%d %d", &x, &y); board[x][y] = 1; } int w; scanf("%d", &w); for(int i = 0; i < w; i++) { int x, y; scanf("%d %d", &x, &y); board[x][y] = 2; } int M = 1; for(int i = 1; i <= m; i++) { int j = 1; while(j <= n) { while(j<=n && board[i][j] != 2) node[i][j++][0] = M; M++; while(j<=n && board[i][j] == 2) j++; } } int N = M+1; for(int j = 1; j <= n; j++) { int i = 1; while(i <= m) { while(i <= m && board[i][j] != 2) node[i++][j][1] = N; N++; while(i <= m && board[i][j] == 2) i++; } } N -= M; EdmondsKarp mf; mf.init(M+N+2); int s = 0; int t = M+N+1; for(int i = 1; i <= M; i++) { mf.addEdge(s, i, 1); } for(int i = M+1; i <= M+N; i++) { mf.addEdge(i, t, 1); } for(int i = 1; i <= m; i++) { for(int j = 1; j <= n; j++) { if(board[i][j] == 1) mf.addEdge(node[i][j][0], node[i][j][1], 1); } } printf("%d\n", mf.maxFlow(0, M+N+1)); } return 0; }