int main() { int T, d, f, b; scanf("%d", &T); while(T--) { scanf("%d%d%d%d%d", &w, &h, &d, &f, &b); for(int i = 0; i < h; i++) scanf("%s", pool[i]); int cost = 0; for(int i = 0; i < h; i++) { if(pool[i][0] == '.') { pool[i][0] = '#'; cost += f; } if(pool[i][w-1] == '.') { pool[i][w-1] = '#'; cost += f; } } for(int i = 0; i < w; i++) { if(pool[0][i] == '.') { pool[0][i] = '#'; cost += f; } if(pool[h-1][i] == '.') { pool[h-1][i] = '#'; cost += f; } } g.init(h*w+2); for(int i = 0; i < h; i++) for(int j = 0; j < w; j++){ if(pool[i][j] == '#') { // grass int cap = INF; if(i != 0 && i != h-1 && j != 0 && j != w-1) cap = d; g.AddEdge(h*w, ID(i,j), cap); // s->grass, cap=d or inf } else { // hole g.AddEdge(ID(i,j), h*w+1, f); // hole->t, cap=f } if(i > 0) g.AddEdge(ID(i,j), ID(i-1,j), b); if(i < h-1) g.AddEdge(ID(i,j), ID(i+1,j), b); if(j > 0) g.AddEdge(ID(i,j), ID(i,j-1), b); if(j < w-1) g.AddEdge(ID(i,j), ID(i,j+1), b); } printf("%d\n", cost + g.Maxflow(h*w, h*w+1)); } return 0; }
void run() { scanf("%d%d",&n,&d); for(int i=1;i<=n;i++) scanf("%s",g1[i]+1); for(int i=1;i<=n;i++) scanf("%s",g2[i]+1); m=strlen(g1[1]+1); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) g1[i][j]-='0'; dinic.init(t); int sum = 0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if(g1[i][j]==0) continue; int u1 = id_p(i,j); int u2 = u1^1; dinic.AddEdge(u1,u2,g1[i][j]); for(int x=i-d;x<=i+d;x++) for(int y=j-d;y<=j+d;y++) { if(abs(x-i)+abs(y-j)>d || (x==i && y==j)) continue; if(!inside(x,y)) { dinic.AddEdge(u2,t,g1[i][j]); goto bk; } else { dinic.AddEdge(u2,id_p(x,y),g1[i][j]); } } bk:; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if(g2[i][j]!='L') continue; if(g1[i][j]==0 && canout(i,j)) continue; sum++; dinic.AddEdge(s,id_l(i,j),1); dinic.AddEdge(id_l(i,j),id_p(i,j),1); } int ans = sum - dinic.Maxflow(s,t); printf("Case #%d: ",cas++); //cout<<sum<<' '; if(ans==0) puts("no lizard was left behind."); else if(ans==1) puts("1 lizard was left behind."); else printf("%d lizards were left behind.\n",ans); }
void solve() { mp[1].clear(); mp[2].clear(); int n1 = 0, n2 = 0; for(int i = 1; i <= n; i++) { if(mp[1][a[i][1]] == 0) { n1++; mp[1][a[i][1]] = n1; b[i][1] = n1; } else { b[i][1] = mp[1][a[i][1]]; } if(mp[2][a[i][2]] == 0) { n2++; mp[2][a[i][2]] = n2; b[i][2] = n2; } else { b[i][2] = mp[2][a[i][2]]; } } g.init(); int st = n1 + n2 + 1, ed = st + 1; for(int i = 1; i <= n1; i++) { g.addEdge(st, i, 1); } for(int i = 1; i <= n2; i++) { g.addEdge(i + n1, ed, 1); } for(int i = 1; i <= n; i++) { g.addEdge(b[i][1], n1 + b[i][2], 1); } int ans = g.Maxflow(st, ed, INF); //printf("%d %d %d\n", n1, n2, ans); printf("%d\n", n - (n2 - ans) - n1); }