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); }
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; }
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; }
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; }
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() { int ans=g.MaxFlow(S,T); printf("%d\n",ans); }