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 n, m; while (cin >> n >> m, n && m) { Dinic<int, 501> dinic; vector<pair<int, int> > e; for (int i=0; i<m; i++) { int a, b, c; cin >> a >> b >> c; e.push_back(make_pair(a, b)); dinic.add_multi(a, b, c); } dinic.exec(1, 2); for (int i=0; i<m; i++) { if ((dinic.level[e[i].first] != -1 && dinic.level[e[i].second] == -1) || (dinic.level[e[i].first] == -1 && dinic.level[e[i].second] != -1)) { cout << e[i].first << " " << e[i].second << endl; } } cout << endl; } return 0; }
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(""); } }
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); }
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) { 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; }
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; }
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 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); }
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 main() { int i,j,count; while(scanf("%d",&n) != EOF) { fun(); Dinic flow; for(i=1 ; i <= n ; ++i){ if(dp[i]==1) flow.insert(0,i,1); if(dp[i]==len) flow.insert(i,n+1,1); for(j=i+1 ; j <= n ; ++j) if(a[j] > a[i]) flow.insert(i,j,1); } printf("%d\n%d\n",len,flow.MaxFlow(0,n+1)); } return 0; }
bool check(int f) { for (int i=sink_start; i<sink_end; i+=2) { dinic.edges[i].cap = f; } for (int i=0; i<dinic.m; i++) { dinic.edges[i].flow = 0; } return dinic.maxflow(src, sink) == n; }
int main() { //freopen("data.txt","r",stdin); int T,cas=1; read(T); while(T--) { read(n),read(m); pre.init();su.init();g.Clear(); for(int i=1,x; i<=n; i++) { read(x); for(int j=0; j<8; j++) if(x&(1<<7-j)) a[j]=1; else a[j]=0; pre.insert(a,i); for(int j=0; j<8; j++) if(x&(1<<j)) a[j]=1; else a[j]=0; su.insert(a,i); } g.Resize(pre.cnt+su.cnt); ss=0; tt=pre.cnt; for(int i=1,cost; i<=m; i++) { scanf("%s %s %d",str,x,&cost); if(str[0]=='P') pre.find(x,cost); else { int len=strlen(x); reverse(x,x+len); su.find(x,cost); } } build(); //g.print(); ll ans=g.MaxFlow(ss,tt); printf("Case #%d: %lld\n",cas++,ans>=INF?-1:ans); } return 0; }
int main() { scanf("%d%d%d%d", &N, &M, &C1, &C2); Dinic dinic; dinic.addEdge(2*C1, 2*C1+1, Dinic::inf); dinic.addEdge(2*C2, 2*C2+1, Dinic::inf); for (int i = 1; i <= M; i++) { int u, v; scanf("%d%d", &u, &v); dinic.addEdge(2*u+1, 2*v, Dinic::inf); dinic.addEdge(2*v+1, 2*u, Dinic::inf); } for (int i = 1; i <= N; i++) { if (i != C1 && i != C2) { dinic.addEdge(2*i, 2*i+1, 1); } } printf("%d\n", dinic.dinic(2*C1, 2*C2+1)); return 0; }
int main() { int N, K; scanf("%d%d", &N, &K); Dinic dinic; const int S = 0, T = 2*N + 1; for (int i = 1; i <= N; i++) { dinic.addEdge(S, i, 1); } for (int i = N+1; i <= 2*N; i++) { dinic.addEdge(i, T, 1); } for (int i = 0; i < K; i++) { int r, c; scanf("%d%d", &r, &c); dinic.addEdge(r, N+c, Dinic::inf); } printf("%d\n", dinic.dinic(S, T)); return 0; }
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; }
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; }
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; }
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; }
int main(){ int n,m,a,b,s,t; while( scanf("%d%d", &n, &m) != EOF ){ Dinic mf; for(int i=0 ; i < m ; ++i){ scanf("%d%d", &a, &b); mf.insert( a, b, 1 ); } scanf("%d%d", &s, &t); printf("%d\n", mf.MaxFlow(s,t)); CLR( ans, 0 ); int cnt = 0; for(int i=0 ; i < mf.end ; ++i) if( net[i].val > 1 ) if( i%2 == 0 ) ans[cnt++] = i/2+1; printf("%d\n", cnt); for(int i=0 ; i < cnt ; ++i) printf("%d\n", ans[i]); } 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); }
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); }
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 solve() { int ans=g.MaxFlow(S,T); printf("%d\n",ans); }
T compute() { T ans=0; while(build()) ans+=find(src, INFI); return ans; } T getFlow(int x, int y) { for(Edge *e=g[x]; e; e=e->next) if(e->y==y) return e->oppo->w; return 0; } }; // ------------------------ template ends here ------------------------ // const int MAXN=222; const int MAXE=MAXN+MAXN*MAXN; Dinic<MAXN, MAXE, int, 1<<30> dinic; int n, a[MAXN], ai[MAXN]; bool isPrime(int x) { for(int y=2; y*y<=x; ++y) if(x%y==0) return false; return true; } int main() { cin>>n; forint(i, 1, n) cin>>a[i]; dinic.init(); forint(i, 1, n) ai[i]=dinic.newNode(); forint(i, 1, n) if(a[i]%2==0) dinic.addEdge(dinic.s(), ai[i], 2, 0); forint(i, 1, n) if(a[i]%2==1) dinic.addEdge(ai[i], dinic.t(), 2, 0);
REP(i, N) { mf.add_edge(st, i, 1); mf.add_edge(N + i, ed, 1); }
REP(i, N) REP(j, N) { if (a[i] < c[j] && b[i] < d[j]) { mf.add_edge(i, N + j, 1); } }