int dep[N],cur[N],flow[M]; bool bfs(){ queue<int> Q; memset(dep,0,sizeof(int)*(V+1)); dep[S]=1; Q.push(S); while(Q.size()){ int u=Q.front();Q.pop(); for(int i=frm[u];i;i=nxt[i]){ int v=to[i]; if(!dep[v]&&cap[i]>flow[i]){ dep[v]=dep[u]+1; Q.push(v); } } } return dep[T]; } int dfs(int u,int f){ if(u==T||!f)return f; int ret=0; for(int &i=cur[u];i;i=nxt[i]){ int v=to[i]; int d; if(dep[v]==dep[u]+1&&(d=dfs(v,min(f-ret,cap[i]-flow[i])))){ flow[i]+=d; flow[i^1]-=d; ret+=d; if(ret==f)break; } } return ret; } int dinic(){ int maxflow=0; while(bfs()){ memcpy(cur,frm,sizeof(int)*(V+1)); maxflow+=dfs(S,INF); } return maxflow; }
|