예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
 REP(i, N) REP(j, N) {
     if (a[i] < c[j] && b[i] < d[j]) {
         mf.add_edge(i, N + j, 1);
     }
 }
예제 #4
0
 REP(i, N) {
     mf.add_edge(st, i, 1);
     mf.add_edge(N + i, ed, 1);
 }