1. 程式人生 > >網路流&費用流模板

網路流&費用流模板


網路流&費用流模板

最大流


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/
  本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。