网络流&费用流模板


网络流&费用流模板##

最大流


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/
  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/shaokele/p/9888670.html