模板:网络流
最大流Dinic算法:
bool bfs(int s){ queue<int>q; memset(dep,0,sizeof(dep)); dep[s]=1; q.push(s); while(!q.empty()){ int x=q.front(); q.pop(); for(int i=pre[x];i;i=nxt[i]){ int y=to[i]; if(w[i]&&!dep[y]){ q.push(y); dep[y]=dep[x]+1; if(y==t) return 1; } } } return 0; } int Dinic(int x,int flow){ if(x==t) return flow; int rest=flow,k; for(int i=pre[x];i&&rest;i=nxt[i]){ int y=to[i]; if(w[i]&&dep[y]==dep[x]+1){ k=Dinic(y,min(rest,w[i])); if(!k) dep[y]=0; w[i]-=k; w[i^1]+=k; rest-=k; } } return flow-rest; } int maxflow(){ int flow=0,max_flow=0; while(bfs(s)){ while(flow=Dinic(s,inf)) max_flow+=flow; } return max_flow; }
未填。。坑