コード例 #1
0
void input()
{
    isap.init(n+m+2);
    src = n+m; sink = src+1;
    for (int i=0; i<n; i++) {
        isap.add_edge(src, i, 1);
        scanf("%s", line);
        while (getchar() != '\n') {
            scanf("%d", &x);
            isap.add_edge(i, x+n, 1);
        }
    }
    sink_start = isap.m;
    for (int i=0; i<m; i++) {
        isap.add_edge(n+i, sink, n);
    }
    sink_end = isap.m;
}
コード例 #2
0
bool check(int f)
{
    for (int i=sink_start; i<sink_end; i+=2) {
        isap.edges[i].cap = f;
    }
    for (int i=0; i<isap.m; i++) {
        isap.edges[i].flow = 0;
    }
    return isap.maxflow(src, sink) == n;
}
コード例 #3
0
ファイル: hdu3879.cpp プロジェクト: Mithril0rd/Rojo
int main() {
    int n, m;
    while (2 == scanf("%d%d", &n, &m)) {
        Isap Flow;
        Flow.init(n + m + 2, 0, n + m + 1);
        for (int i = 1; i <= n; ++i) {
            int v;
            scanf("%d", &v);
            Flow.addedge(i, n + m + 1, v);
        }
        int sum = 0;
        for (int i = 1; i <= m; ++i) {
            int u, v, w;
            scanf("%d%d%d", &u, &v, &w);
            Flow.addedge(0, i + n, w);
            Flow.addedge(i + n, u, INF);
            Flow.addedge(i + n, v, INF);
            sum += w;
        }
        int ans = Flow.maxFlow();
        printf("%d\n", sum - ans);
    }
    return 0;
}
コード例 #4
0
ファイル: hdu4888.cpp プロジェクト: Mithril0rd/ComplexCode
int main() {
    while (3 == scanf("%d %d %d", &n, &m, &k)) {
        Isap ans;
        ans.init(n + m + 2, 0, n + m + 1);
        int s = 0, t = n + m + 1;
        long long sum1 = 0, sum2 = 0;
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                ans.addedge(i, n + j, k);
            }
        }
        for (int i = 1; i <= n; ++i) {
            int rowSum = 0;
            scanf("%d", &rowSum);
            sum1 += rowSum;
            ans.addedge(0, i, rowSum);    
        }
        for (int i = 1; i <= m; ++i) {
            int colSum = 0;
            scanf("%d", &colSum);
            sum2 += colSum;
            ans.addedge(n + i, t, colSum);
        }       
        int q = ans.maxFlow();
        if (sum1 != sum2 || q != sum1) puts("Impossible");
        else {
            int edge = 0;
            for (int i = 1; i <= n; ++i) {
                for (int j = 1; j <= m; ++j, edge += 2) {
                    mat[i][j] = G[edge ^ 1].cap;
                }
            }
            memset(c, false, sizeof c);
            bool f = false;
            for (int i = 1; i <= n; ++i) {
                for (int j = 1; j <= m; ++j) {
                    for (int l = j + 1; l <= m; ++l) {
                        bool f1 = false, f2 = false;
                        if (mat[i][j] != k && mat[i][l] != 0) {// column j could add, column l could dec 
                            if (c[l][j]) {
                                l = m + 1, j = m + 1, i = n + 1;
                                f = true;
                            }
                            f1 = true;
                        }
                        if (mat[i][j] != 0 && mat[i][l] != k) {// column l could add, column j could dec
                            if (c[j][l]) {
                                l = m + 1, j = m + 1, i = n + 1;
                                f = true;
                            }
                            f2 = true;
                        }
                        if (f1) c[j][l] = true;
                        if (f2) c[l][j] = true;
                    }
                }
            }
            if (f) puts("Not Unique");
            else {
                puts("Unique");
                for (int i = 1; i <= n; ++i) {
                    for (int j = 1; j <= m; ++j) {
                        if (j == 1) printf("%d", mat[i][j]);
                        else printf(" %d", mat[i][j]);
                    }
                    puts("");
                }
            } 
        }
    } 
    return 0;
}