/*网络流最大流模板
输入:
点数n,边数m,起点s,终点t
m条边:起点,终点,最大流量
输出:
最大流*/
const int maxn=10010;
const int inf=1e15;
int n,m,s,t;
struct edge{
int to,next,value;
}e[maxn];
int first[maxn]={0},cntedge=0;
void addedge(int fr,int to,int value){
e[cntedge++]={to,first[fr],value};first[fr]=cntedge-1;
swap(fr,to);
e[cntedge++]={to,first[fr],0};first[fr]=cntedge-1;
}
int dis[210];
int cur[maxn];
int bfs(){
memset(dis,-1,sizeof(dis));
queue<int>q;
cur[s]=first[s];
dis[s]=0;q.push(s);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=first[u];i!=-1;i=e[i].next){
int v=e[i].to;
if(dis[v]==-1&&e[i].value>0){
dis[v]=dis[u]+1;
cur[v]=first[v];
q.push(v);
}
}
}
return dis[t]!=-1;
};
int dfs(int u,int exp){
if(u==t)return exp;
int flow=0,tmp=0;
for(int i=cur[u];i!=-1;i=e[i].next){
int v=e[i].to;
cur[u]=i;
if((dis[v]==dis[u]+1)&&(e[i].value>0)){
tmp=dfs(v,min(exp,e[i].value));
if(!tmp){dis[v]=0;continue;}
exp-=tmp;
flow +=tmp;
e[i].value -=tmp;
e[i^1].value +=tmp;
if(!exp)break;
}
}
return flow;
}
while(bfs()){
ans+=dfs(s,inf);
}