Dinic:
int tot; int front[N],to[M<<1],nxt[M<<1],val[M<<1]; int src,decc; int cur[N],lev[N]; queue<int>q; void read(int &x) { x=0; char c=getchar(); while(!isdigit(c)) { if(c==‘-‘) f=-1; c=getchar(); } while(isdigit(c)) { x=x*10+c-‘0‘; c=getchar(); } } void add(int u,int v,int w) { to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; val[tot]=w; to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; val[tot]=0; } bool bfs() { while(!q.empty()) q.pop(); for(int i=src;i<=decc;i++) lev[i]=-1,cur[i]=front[i]; lev[src]=0; q.push(src); int now; while(!q.empty()) { now=q.front(); q.pop(); for(int i=front[now];i;i=nxt[i]) { if(lev[to[i]]==-1&&val[i]>0) { lev[to[i]]=lev[now]+1; if(to[i]==decc) return true; q.push(to[i]); } } } return false; } int dinic(int now,int flow) { if(now==decc) return flow; int rest=0,delta; for(int &i=cur[now];i;i=nxt[i]) { if(lev[to[i]]>lev[now]&&val[i]>0) { delta=dinic(to[i],min(flow-rest,val[i])); if(delta) { val[i]-=delta; val[i^1]+=delta; rest+=delta; if(rest==flow) break; } } } if(rest==flow) lev[now]=-1; return rest; }