int n,m,k,S,T; int head[N],hcnt,lel[N],cur[N]; struct Node{int to,nxt,v;}node[maxn]; inline void add(int x,int y,int v){ node[hcnt].to=y;node[hcnt].nxt=head[x];node[hcnt].v=v;head[x]=hcnt++; node[hcnt].to=x;node[hcnt].nxt=head[y];node[hcnt].v=0;head[y]=hcnt++; } int bfs(){ mst(lel,-1);lel[S]=0; queue<int>q;q.push(S); while(!q.empty()){ int x=q.front();q.pop(); for(int i=head[x];~i;i=node[i].nxt){ int e=node[i].to; if(lel[e]!=-1||!node[i].v)continue; lel[e]=lel[x]+1; if(e==T)return 1; q.push(e); } } return 0; } int dfs(int x,int f){ if(x==T)return f; int fl,ret=0,e; for(int i=cur[x];~i;i=node[i].nxt){ e=node[i].to; if(lel[e]==lel[x]+1){ fl=f-ret; fl=dfs(e,min(fl,node[i].v)); ret+=fl; node[i].v-=fl;node[i^1].v+=fl; if(f==ret)return f; } } if(!ret)lel[x]=-1; return ret; } int dinic(){ int ans=0; while(bfs()){ mcp(cur,head); ans+=dfs(S,inf); } return ans; }