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; }
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; }
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; }
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; }