poj 药丸。。
居然读入优化都不给过
去掉读入优化就a了
害我wa一天。。。
药丸
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int T,n,m,c,u,v,w,st,en;
int U[5010],V[5010],UF[5010],LF[5010],CNT;
int a[210][25],b[210][25];
int s1,s2,ex[310];
int gap[310],h[310];
struct edge {
int v,f,next;
}e[30010];
int head[310],cnt;
int read_int () {
int x;
scanf("%d",&x);
return x;
}
void adde (int u,int v,int f) {
if(!f)
return;
e[cnt].v = v;
e[cnt].f = f;
e[cnt].next = head[u];
head[u] = cnt++;
e[cnt].v = u;
e[cnt].f = 0;
e[cnt].next = head[v];
head[v] = cnt++;
}
int dfs (int u,int minf) {
if(u == en)
return minf;
int chan = en;
int leftf = minf;
for(int i = head[u];i != -1;i = e[i].next) {
int v = e[i].v;
if(e[i].f) {
if(h[v] == h[u] - 1) {
int t = dfs(v,min(leftf,e[i].f));
e[i].f -= t;
e[i ^ 1].f += t;
leftf -= t;
if(h[st] == en + 1)
return minf - leftf;
if(!leftf)
break;
}
chan = min(chan,h[v]);
}
}
if(leftf == minf) {
if(--gap[h[u]] == 0)
h[st] = en + 1;
++gap[h[u] = chan + 1];
}
return minf - leftf;
}
bool sap () {
gap[0] = en + 1;
int re = 0;
while(h[st] < en + 1)
re += dfs(st,0x3f3f3f3f);
if(re == s1 && s1 == s2)
return 1;
return 0;
}
void deal (char C,bool &f) {
if(C == '=') {
if(UF[a[u][v]] < w || LF[a[u][v]] > w) {
f = 1;
return;
}
UF[a[u][v]] = LF[a[u][v]] = w;
}
else {
if(C == '<') {
if(w >= UF[a[u][v]])
return;
if(w < LF[a[u][v]]) {
f = 1;
return;
}
UF[a[u][v]] = w;
}
else {
if(LF[a[u][v]] >= w)
return;
if(UF[a[u][v]] < w) {
f = 1;
return;
}
LF[a[u][v]] = w;
}
}
}
int main () {
T = read_int();
for(int faq = 1;faq <= T;++faq) {
memset(head,-1,sizeof head);
memset(a,0,sizeof a);
memset(b,0,sizeof b);
memset(ex,0,sizeof ex);
memset(gap,0,sizeof gap);
memset(h,0,sizeof h);
s1 = s2 = cnt = CNT = 0;
n = read_int();
m = read_int();
for(int i = 1;i <= n;++i) {
U[++CNT] = 0;
V[CNT] = i;
UF[CNT] = LF[CNT] = read_int();
}
for(int i = 1;i <= m;++i) {
U[++CNT] = i + n;
V[CNT] = n + m + 1;
UF[CNT] = LF[CNT] = read_int();
}
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j) {
a[i][j] = ++CNT;
U[CNT] = i;
V[CNT] = j + n;
UF[CNT] = 0x3f3f3f3f;
LF[CNT] = 0;
}
bool f = 0;
c = read_int();
char C;
for(int i = 1;i <= c;++i) {
u = read_int();
v = read_int();
scanf(" %c",&C);
w = read_int();
if(C == '<')
--w;
if(C == '>')
++w;
if(f)
continue;
if(u == 0 && v == 0) {
for(u = 1;u <= n;++u)
for(v = 1;v <= m;++v)
deal(C,f);
}
else {
if(u == 0) {
for(u = 1;u <= n;++u)
deal(C,f);
continue;
}
if(v == 0) {
for(v = 1;v <= m;++v)
deal(C,f);
continue;
}
deal(C,f);
}
}
if(f) {
puts("IMPOSSIBLE");
continue;
}
st = n + m + 2;
en = n + m + 3;
for(int i = 1;i <= CNT;++i) {
adde(U[i],V[i],UF[i] - LF[i]);
ex[U[i]] -= LF[i];
ex[V[i]] += LF[i];
}
for(int i = 0;i <= n + m + 1;++i) {
if(ex[i] > 0) {
adde(st,i,ex[i]);
s1 += ex[i];
}
if(ex[i] < 0) {
adde(i,en,-ex[i]);
s2 += -ex[i];
}
}
adde(n + m + 1,0,0x3f3f3f3f);
if(sap()) {
for(int i = 1;i <= n;++i) {
for(int j = head[i];j != -1;j = e[j].next) {
if((j & 1) || e[j].v == en)
continue;
b[i][e[j].v - n] = e[j ^ 1].f;
}
}
for(int i = 1;i <= CNT;++i)
if(U[i] != 0 && V[i] != n + m + 1)
b[U[i]][V[i] - n] += LF[i];
for(int i = 1;i <= n;++i) {
printf("%d",b[i][1]);
for(int j = 2;j <= m;++j)
printf(" %d",b[i][j]);
printf("\n");
}
puts("");
}
else puts("IMPOSSIBLE");
}
return 0;
}