網路流&費用流模板
阿新 • • 發佈:2018-11-01
網路流&費用流模板
最大流
struct edge{ int to,val,next; }e[]; int cnt_edge,last[],cur[],dis[]; inline void add_edge(int u,int v,int w){ e[++cnt_edge]=(edge){v,w,last[u]};last[u]=cnt_edge; e[++cnt_edge]=(edge){u,0,last[v]};last[v]=cnt_edge; } bool bfs(){ queue<int> Q; for(int i=S;i<=T;i++) dis[i]=-1; Q.push(S);dis[S]=0; while(!Q.empty()){ int now=Q.front();Q.pop(); for(int i=last[now];i!=-1;i=e[i].next) if(e[i].val && dis[e[i].to]==-1){ dis[e[i].to]=dis[now]+1; Q.push(e[i].to); } } return dis[T]!=-1; } int dfs(int u,int flow){ if(u==T) return flow; int used=0; for(int i=cur[u];i!=-1;i=e[i].next) if(dis[e[i].to]==dis[u]+1){ int tot=dfs(e[i].to,min(flow-used,e[i].val)); e[i].val-=tot;e[i^1].val+=tot; if(e[i].val)cur[u]=i; used+=tot; if(used==flow) return flow; } if(!used)dis[u]=-1; return used; } int dinic(){ int ans=0; while(bfs()){ for(int i=S;i<=T;i++) cur[i]=last[i]; ans+=dfs(S,inf); } return ans; }
作者:skl_win
出處:https://www.cnblogs.com/shaokele/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。