Time Limit: 4000MS | Memory Limit: 65536K | |
Total Submissions: 13052 | Accepted: 4442 |
Descriptionide
Inputthis
Outputspa
Sample Inputcode
1 3 3 1 1 1 0 1 1 1 2 2 1 0 1 1 2 3 1 1 1 2 1 1 1 1 1 3 2 20 0 0 0
Sample Outputblog
4 -1
Sourcethree
#include <stdio.h> #include <string.h> #include <algorithm> #define min(a, b) ((a) < (b) ? (a) : (b)) #define REP(i, n) for(int i = 1; i <= n; ++i) using namespace std; const int maxE = 3000000; const int maxN = 300; const int oo = 0x3f3f3f3f; struct Edge{ int v, c, w, n; }; Edge edge[maxE]; int adj[maxN], l; int d[maxN], cur[maxN], a[maxN]; int inq[maxN], Q[maxE], head, tail; int n, m, k; int cost, flow, s, t; int nk[maxN][maxN], mk[maxN][maxN]; void addedge(int u, int v, int c, int w){ edge[l].v = v; edge[l].c = c; edge[l].w = w; edge[l].n = adj[u]; adj[u] = l++; edge[l].v = u; edge[l].c = 0; edge[l].w = -w; edge[l].n = adj[v]; adj[v] = l++; } int SPFA(){ memset(d, oo, sizeof d); memset(inq, 0, sizeof inq); head = tail = 0; d[s] = 0; a[s] = oo; cur[s] = -1; Q[tail++] = s; while(head != tail){ int u = Q[head++]; inq[u] = 0; for(int i = adj[u]; ~i; i = edge[i].n){ int v = edge[i].v; if(!edge[i].c || d[v] <= d[u] + edge[i].w) continue; d[v] = d[u] + edge[i].w; cur[v] = i; a[v] = min(edge[i].c, a[u]); if(inq[v]) continue; inq[v] = 1; Q[tail++] = v; } } if(d[t] == oo) return 0; flow += a[t]; cost += a[t] * d[t]; for(int i = cur[t]; ~i; i = cur[edge[i ^ 1].v]){ edge[i].c -= a[t]; edge[i ^ 1].c += a[t]; } return 1; } int MCMF(){ while(SPFA()); return flow; } void work(){ int w, sum = 0, _sum = 0; REP(i, n) REP(j, k) scanf("%d", &nk[i][j]); REP(i, m) REP(j, k) scanf("%d", &mk[i][j]); REP(i, n) REP(j, k) sum += nk[i][j]; REP(i, m) REP(j, k) _sum += mk[i][j]; if(sum > _sum){ REP(k1, k) REP(i, n) REP(j, m) scanf("%*d"); printf("-1\n"); return; } s = 0; t = m + n + 1; flow = cost = 0; REP(k1, k) { memset(adj, -1, sizeof adj); l = 0; REP(i, n) REP(j, m){ scanf("%d", &w); addedge(i, j + n, oo, w); } REP(i, n) addedge(s, i, nk[i][k1], 0); REP(j, m) addedge(j + n, t, mk[j][k1], 0); MCMF(); } printf("%d\n", flow == sum ? cost : -1); } int main(){ while(~scanf("%d%d%d", &n, &m, &k) && (n || m || k)) work(); return 0; }