void input() { dinic.init(); src = n+m; sink = src+1; for (int i=0; i<n; i++) { dinic.add_edge(src, i, 1); scanf("%s", line); while (getchar() != '\n') { scanf("%d", &x); dinic.add_edge(i, x+n, 1); } } sink_start = dinic.m; for (int i=0; i<m; i++) { dinic.add_edge(n+i, sink, n); } sink_end = dinic.m; }
int main() { int i, j, k; int s, t; int w; int m, n, f; int tc, cn(0); int tot, vt; int p; //freopen("f:\\in.txt", "r", stdin); scanf("%d", &tc); while (tc--) { scanf("%d %d %d", &n, &m, &f); s = 1, t = n + 1; dinic.init(s, t); for (i=0; i<m; ++i) { scanf("%d %d %d", x+i, y+i, &w); dinic.add_edge(x[i], y[i], w); } vt = 0; for (i=0; i<f; ++i) { scanf("%d %d", &k, &w); dinic.add_edge(k, t, w); vt += w; } tot = dinic.flow(); vt -= tot; printf("Case %d: %d\n", ++cn, vt); k = dinic.cut(cut); for (i=0; i<=t; v[i++]=false); for (i=0; i<k; v[cut[i++]]=true); p = 0; for (i=0; i<m; ++i) { if (!v[x[i]] && v[y[i]]) res[p++] = i + 1; } printf("%d", p); for (i=0; i<p; ++i) printf(" %d", res[i]); puts(""); } return 0; }
REP(i, N) REP(j, N) { if (a[i] < c[j] && b[i] < d[j]) { mf.add_edge(i, N + j, 1); } }
REP(i, N) { mf.add_edge(st, i, 1); mf.add_edge(N + i, ed, 1); }