POJ 2396 Budget 上下界网络流(二)

2014-11-24 11:31:54 · 作者: · 浏览: 1
if(u != src)
u = edge[revpath[u]].ver; // Backtrack
}
}
return totalflow;
}
int low[MAXN][MAXN], up[MAXN][MAXN];
int xj[MAXN];
int col, row, s, t;
bool build()
{
for(int i = 1; i <= row; i++)
for(int j = 1; j <= col; j++)
{
if(low[i][j] > up[i][j]) return false;
else
{
xj[i] -= low[i][j];
xj[j + row] += low[i][j];
add(i, j + row, up[i][j] - low[i][j]);
}
}
return true;
}
void solve()
{
src = t + 1;
des = t + 2;
n = des;
for(int i = 1; i <= t; i++)
if(xj[i] > 0) add(src, i, xj[i]);
else if(xj[i] < 0) add(i, des, -xj[i]);
add(t, s, INF);
rev_BFS();
maxflow();
for(int i = head[src]; i != -1; i = edge[i].next)
if(edge[i].cap > 0)
{
printf("IMPOSSIBLE\n\n");
return;
}
for(int i = 1; i <= row; i++)
for(int j = 1; j <= col; j++)
{
printf("%d", edge[((i - 1) * col + j - 1) * 2].flow + low[i][j]);
if(j < col) putchar(' ');
else putchar('\n');
}
printf("\n");
}
int main()
{
int T, u, v, w;
char op[5];
scanf("%d", &T);
while(T--)
{
init();
scanf("%d%d", &row, & col);
memset(xj, 0, sizeof(xj));
for(int i = 0; i < row + 5; i++)
for(int j = 0; j < col + 5; j++)
low[i][j] = 0, up[i][j] = INF;
s = row + col + 1;
t = row + col + 2;
for(int i = 1; i <= row; i++)
{
scanf("%d", &u);
xj[s] -= u;
xj[i] += u;
}
for(int i = row + 1; i <= row + col; i++)
{
scanf("%d", &u);
xj[t] += u;
xj[i] -= u;
}
int q, lc, rc, lr, rr;
scanf("%d", &q);
while(q--)
{
scanf("%d%d%s%d", &u, &v, op, &w);
lr = rr = u;
lc = rc = v;
if(u == 0) lr = 1, rr = row;
if(v == 0) lc = 1, rc = col;
for(int i = lr; i <= rr; i++)
for(int j = lc; j <= rc; j++)
{
if(op[0] == '=') low[i][j] = max(low[i][j], w), up[i][j] = min(up[i][j], w);
else if(op[0] == '<') up[i][j] = min(w - 1, up[i][j]);
else if(op[0] == '>') low[i][j] = max(low[i][j], w + 1);
}
}
if(build()) solve();
else printf("IMPOSSIBLE\n\n");
}
return 0;
}