コード例 #1
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;
}
コード例 #2
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;
}