Code
bool bfs(int S){//构建分层图
queue<int> q;
memset(d,0,sizeof(d));
d[S]=1,q.push(S);
while(q.size()){
int x=q.front();q.pop();
for(int i=lin[x];i;i=e[i].n){
int y=e[i].y;
if(d[y]||!e[i].v)continue;
d[y]=d[x]+1;
q.push(y);
}
}
return d[T]>0;
}
int dfs(int x,int minf){//minf为可以流到该点的流量
int sum=0,flow=0;//sum为该点可以流出的流量之和
if(x==T)return minf;
for(int &i=cur[x];i;i=e[i].n){//当前弧优化
int y=e[i].y;
if(d[y]==d[x]+1&&e[i].v){
flow=dfs(y,min(minf,e[i].v));
if(!flow)d[y]=0;//如果y向后不能再流了,就炸掉y点
sum+=flow,minf-=flow,e[i].v-=flow,e[i^1].v+=flow;//更新
if(!minf)return sum;//如果前面的都流完了,直接返回
}
}return sum;
}
void dinic(){
while(bfs(S)){
rep(i,1,n)cur[i]=lin[i];
maxflow+=dfs(S,inf);
}
}