void solve(void) { int totalp = 0; for(int i=0;i<n;++i) totalp += ni[i]; for(int i=0;i<n;++i) for(int j=0;j<n;++j) if(hypot(x[i]-x[j],y[i]-y[j])<=D) mat[i][j] = 1; else mat[i][j] = 0; vector<int> ans; for(int zz=0;zz<n;++zz) { dinic.init(n*2+1); for(int i=0;i<n;++i) dinic.addedge(i,i+n,mi[i]); for(int i=0;i<n;++i) dinic.addedge(n*2,i,ni[i]); for(int i=0;i<n;++i) for(int j=0;j<n;++j) if(mat[i][j]) dinic.addedge(i+n,j,totalp); if(totalp==dinic.maxFlow(n*2,zz)) ans.push_back(zz); } if(ans.empty()) puts("-1"); else { for(int i=0;i<(int)ans.size();++i) { if(i) putchar(' '); printf("%d",ans[i]); } puts(""); } }
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; }
bool check(int mid) { source = n1+n2; sink = n1+n2+1; dinic.init(n1+n2+2); for(int i=0;i<n1;++i) dinic.addedge(source,i,1); for(int i=0;i<n2;++i) dinic.addedge(i+n1,sink,cap[i]); for(int i=0;i<n1;++i) for(int j=0;j<n2;++j) if(mat[i][j]<=mid) dinic.addedge(i,j+n1,1); dinic.maxFlow(source,sink); return dinic.totalflow==n1; }
bool check(int mid) { for(int z=0;z+mid-1<B;++z) { dinic.init(n+B+2); for(int i=0;i<n;++i) dinic.addedge(n+B,i,1); for(int i=0;i<B;++i) dinic.addedge(n+i,n+B+1,cap[i]); for(int i=z;i<z+mid;++i) for(int j=0;j<n;++j) dinic.addedge(j,n+prefer[j][i],1); if(dinic.maxFlow(n+B,n+B+1)==n) return true; } return false; }
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 input(void) { scanf("%d%d",&n,&m); memset(deg,0,sizeof(deg)); memset(out,0,sizeof(out)); memset(in,0,sizeof(in)); dinic.init(n+2); for(int i=0;i<m;++i) { int u,v,di; scanf("%d%d%d",&u,&v,&di); ++out[u]; ++in[v]; if(!di) dinic.addedge(u,v,1); } }
void input() { dinic.init(); src = n+m; sink = src+1; for (int i=0; i<n; i++) { dinic.add_edge(src, i, 1); scanf("%s", line); while (getchar() != '\n') { scanf("%d", &x); dinic.add_edge(i, x+n, 1); } } sink_start = dinic.m; for (int i=0; i<m; i++) { dinic.add_edge(n+i, sink, n); } sink_end = dinic.m; }
int getshortest(void) { if(D>=W) return 1; build(); dinic.init(MAXN); int totalcnt = 0; for(int tt=1;tt<=n+m;++tt) { for(int i=0;i<n;++i) if(jumpfroms[i]) dinic.addedge(id(source),id(instoneid[tt][i]),INF); for(int i=0;i<n;++i) dinic.addedge(id(instoneid[tt][i]),id(outstoneid[tt][i]),ci[i]); if(tt==1) continue; for(int i=0;i<n;++i) if(jumpfromt[i]) dinic.addedge(id(outstoneid[tt-1][i]),id(sink),INF); for(int i=0;i<n;++i) for(int j=0;j<n;++j) if(canjump[i][j]) dinic.addedge(id(outstoneid[tt-1][i]),id(instoneid[tt][j]),INF); dinic.maxFlow(source,sink); totalcnt += dinic.totalflow; if(totalcnt>=m) return tt; } return -1; }
int main() { int i, j, k; int s, t; int w; int m, n, f; int tc, cn(0); int tot, vt; int p; //freopen("f:\\in.txt", "r", stdin); scanf("%d", &tc); while (tc--) { scanf("%d %d %d", &n, &m, &f); s = 1, t = n + 1; dinic.init(s, t); for (i=0; i<m; ++i) { scanf("%d %d %d", x+i, y+i, &w); dinic.add_edge(x[i], y[i], w); } vt = 0; for (i=0; i<f; ++i) { scanf("%d %d", &k, &w); dinic.add_edge(k, t, w); vt += w; } tot = dinic.flow(); vt -= tot; printf("Case %d: %d\n", ++cn, vt); k = dinic.cut(cut); for (i=0; i<=t; v[i++]=false); for (i=0; i<k; v[cut[i++]]=true); p = 0; for (i=0; i<m; ++i) { if (!v[x[i]] && v[y[i]]) res[p++] = i + 1; } printf("%d", p); for (i=0; i<p; ++i) printf(" %d", res[i]); puts(""); } return 0; }
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); }