dinic
//HDU 3549
int dis[N],vis[N],clock;
int st,ed;
queue<int> qq;
int bfs(){
clock++;
qq.push(st);vis[st]=clock;dis[st]=0;
while(!qq.empty()){
int u=qq.front();qq.pop();
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(e[i].cap&&vis[v]!=clock){
vis[v]=clock;
dis[v]=dis[u]+1;
qq.push(v);
}
}
}
return vis[ed]==clock;
}
int cur[N];
int dfs(int u,int pre){
if(u==ed||pre==0)return pre;
int flow=0;
for(int &i=cur[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(e[i].cap&&dis[v]==dis[u]+1){
int f=dfs(v,min(pre,e[i].cap));
e[i].cap-=f;
e[i^1].cap+=f;
pre-=f;
flow+=f;
}
if(pre==0)break;
}
return flow;
}
int dinic(int n){
int flow=0;
clock=0;
memset(vis,0,sizeof(vis));
while(bfs()){
for(int i=0;i<n;i++)cur[i]=head[i];
flow+=dfs(st,INF);
}
return flow;
}
ispa
//HDU 3549
int cur[N],gap[N],dis[N],pre[N];
int isap(int st,int ed,int n){
int flow=0;
for(int i=0; i<n; i++){
dis[i]=gap[i]=0;
cur[i]=head[i];
}
int u=pre[st]=st;
int aug=INF;
gap[0]=n;
while(dis[st]<n){
loop:
for(int &i=cur[u]; i!=-1; i=e[i].next){
int v=e[i].v;
if(e[i].cap>0 && dis[u]==dis[v]+1){
aug=min(aug,e[i].cap);
pre[v]=u;
u=v;
if(v==ed){
flow+=aug;
for(u=pre[u]; v!=st; v=u,u=pre[u]){
e[cur[u]].cap-=aug;
e[cur[u]^1].cap+=aug;
}
aug=INF;
}
goto loop;
}
}
int mm=n-1;
for(int i=head[u]; i!=-1; i=e[i].next){
int v=e[i].v;
if(e[i].cap>0 && mm>dis[v]){
cur[u]=i;
mm=dis[v];
}
}
if(--gap[dis[u]]==0) break;
gap[dis[u]=mm+1]++;
u=pre[u];
}
return flow;
}