structnode{ int Next,y,v; }Pth[880005]; int tot=1,head[20005]; inlinevoidadd(int x,int y,int v){ Pth[++tot]={head[x],y,v};head[x]=tot; Pth[++tot]={head[y],x,0};head[y]=tot; } int d[20005],S,T,INF=0x3f3f3f3f; int qu[60005]; boolbfs(){ memset(d,0,sizeof d); int l=0,r=0; qu[++r]=S; d[S]=1; while (l<r){ int x=qu[++l]; for (int i=head[x];i;i=Pth[i].Next){ int y=Pth[i].y; if (!d[y] && Pth[i].v){ d[y]=d[x]+1; qu[++r]=y; if (y==T) return1; } } } return0; } intdinic(int x,int flow){ if (x==T) return flow; int rest=flow,k; for (int i=head[x];i&&rest;i=Pth[i].Next){ int y=Pth[i].y; if (Pth[i].v && d[y]==d[x]+1){ k=dinic(y,min(rest,Pth[i].v)); if (!k) d[y]=0; Pth[i].v-=k; Pth[i^1].v+=k; rest-=k; } } return flow-rest; } ll solve(int s,int t){ ll flow,maxflow=0; S=s,T=t; while (bfs()){ while (flow=dinic(s,INF)) maxflow+=flow; } return maxflow; }