void dfs(Node *p,int flag) { if(flag) { if(p->ln[0]) { g.addedge(p->ln[0]-su.rt+pre.cnt,p-su.rt+pre.cnt,p->ln[0]->cost); dfs(p->ln[0],1); } if(p->ln[1]) { g.addedge(p->ln[1]-su.rt+pre.cnt,p-su.rt+pre.cnt,p->ln[1]->cost); dfs(p->ln[1],1); } } else { if(p->ln[0]) { g.addedge(p-pre.rt,p->ln[0]-pre.rt,p->ln[0]->cost); dfs(p->ln[0],0); } if(p->ln[1]) { g.addedge(p-pre.rt,p->ln[1]-pre.rt,p->ln[1]->cost); dfs(p->ln[1],0); } } }
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(""); } }
bool solve(void) { int flowneed = 0; for(int i=1;i<=n;++i) { deg[i] = out[i] - in[i]; if(deg[i]%2!=0) return false; if(deg[i]>0) dinic.addedge(0,i,deg[i]/2); else if(deg[i]<0) dinic.addedge(i,n+1,-deg[i]/2); flowneed += deg[i]>0 ? deg[i]/2 : 0; } return flowneed==dinic.maxFlow(0,n+1); }
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 build() { for(int i=1; i<=n; i++) g.addedge(pre.pos[i],su.pos[i]+pre.cnt,INF); dfs(pre.rt,0); dfs(su.rt ,1); }
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; }
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); } }