码迷,mamicode.com
首页 > 其他好文 > 详细

Dinic 网络流

时间:2018-10-03 20:34:25      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:line   turn   for   ||   nic   ret   int   ems   return   

写个博客贴板子……

inline void add_edge(int x,int y,int z){
    e[++tot].x=y,e[tot].cap=z;
    e[tot].next=h[x],h[x]=tot;
    e[++tot].x=x,e[tot].cap=z;
    e[tot].next=h[y],h[y]=tot;
}

bool bfs(){
    queue<int> q;
    memset(deth,-1,sizeof(deth));
    deth[S]=0,q.push(S),cur[S]=h[S];
    while(!q.empty()){
        int x=q.front();q.pop();
        for(int i=h[x];i;i=e[i].next){
            if(!e[i].cap||~deth[e[i].x])continue;
            deth[e[i].x]=deth[x]+1;
            cur[e[i].x]=h[e[i].x];
            q.push(e[i].x);
            if(e[i].x==T)return true;
        }
    }
    return false;
}

int dfs(int x,int flow){
    if(x==T)return flow;
    for(int &i=cur[x];i;i=e[i].next)
        if(e[i].cap&&deth[e[i].x]==deth[x]+1){
            int sum=dfs(e[i].x,min(flow,e[i].cap));
            if(sum>0){
                e[i].cap-=sum,e[i^1].cap+=sum;
                return sum;
            }
        }
    return 0;
}

int dinic(){
    int ans=0,k;
    while(bfs())
    while(k=dfs(S,2e9))ans+=k;
    return ans;
}

Dinic 网络流

标签:line   turn   for   ||   nic   ret   int   ems   return   

原文地址:https://www.cnblogs.com/ezoiLZH/p/9739177.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!