void buildgraph() { for(int i=1;i<=M;i++) scanf("%d",&pig_num[i]); S=0;T=N+1;Num=T+1; g.ClearAll(Num); memset(hash,0,sizeof(hash)); for(int i=1;i<=N;i++) { int Qnum; scanf("%d",&Qnum); for(int j=1;j<=Qnum;j++) { int a; scanf("%d",&a); if(hash[a]==0) { g.AddEdge(S,i,pig_num[a]); hash[a]=i; }else { g.AddEdge(hash[a],i,INF); } } scanf("%d",&people_need[i]); } for(int i=1;i<=N;i++) g.AddEdge(i,T,people_need[i]); }
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 BuildGraph(int n, int m) { S = 0, T = n + n + 1; net.Init(S + T + 1); for (int i = 0; i < n; ++i) { int c = CountBit(i); if (c & 1) { net.AddEdge(S, i + 1, Less[i]); net.AddEdge(i + 1 + n, T, More[i]); } else { net.AddEdge(S, i + 1, More[i]); net.AddEdge(i + 1 + n, T, Less[i]); } net.AddEdge(i + 1, i + 1 + n, INF); for (int j = i + 1; j < n; ++j) { if (CountBit(i ^ j) == 1) { if (c & 1) { net.AddEdge(i + 1, j + 1 + n, u[i] ^ u[j]); } else { net.AddEdge(j + 1, i + 1 + n, u[i] ^ u[j]); } } } } net.MaxFlow(S, T); }
double buildgraph(double mid) { g.ClearAll(Num); for(int i=1;i<=N;i++) { g.AddEdge(S,i,M+0.0); g.AddEdge(i,T,M+2*mid-degree[i]); } for(int i=1;i<=M;i++) { int u=path[i].u; int v=path[i].v; g.AddEdge(u,v,1.0); g.AddEdge(v,u,1.0); } double floow=g.MaxFlow(S,T); return (M*N-floow)/2; }
bool judge(double mid) { double ans=0; g.ClearAll(Num); for(int i=1;i<=M;i++) { if(data[i].d<=mid) ans+=data[i].d-mid; else { g.AddEdge(data[i].u,data[i].v,data[i].d-mid); g.AddEdge(data[i].v,data[i].u,data[i].d-mid); } } ans+=g.MaxFlow(S,T); if(ans>=0/*||fabs(ans-0)<=eps*/) { return true; } return false; }