void add(int u,int v,int w){ e[tot].v=v; e[tot].w=w; e[tot].nt=pre[u]; pre[u]=tot++; e[tot].v=u; e[tot].w=0; e[tot].nt=pre[v]; pre[v]=tot++; } bool bfs(){ mt(dis,-1); dis[s]=0; queue<int> q; while(sz(q)) q.pop(); q.push(s); while(sz(q)){ int u=q.front();q.pop(); for(int i=pre[u];~i;i=e[i].nt){ int v=e[i].v,w=e[i].w; if(dis[v]==-1&&w>0){ dis[v]=dis[u]+1; if(v==t) return 1; q.push(v); } } } return dis[t]!=-1; } int dfs(int u,int cp){ if(u==t) return cp; int tmp=cp; for(int i=pre[u];~i;i=e[i].nt){ int v=e[i].v,w=e[i].w; if(dis[v]==dis[u]+1&&w>0){ int tt=dfs(v,min(tmp,w)); e[i].w-=tt; e[i^1].w+=tt; tmp-=tt; if(tmp<=0) return cp; } } return cp-tmp; } int dinic(){ int ret=0; while(bfs()) ret+=dfs(s,inf); return ret; }