首页 > 其他 > 详细

最大流

时间:2017-12-11 00:16:28      阅读:280      评论:0      收藏:0      [点我收藏+]

 

Dinic:

int tot;
int front[N],to[M<<1],nxt[M<<1],val[M<<1];

int src,decc;

int cur[N],lev[N];

queue<int>q;

void read(int &x)
{
    x=0; char c=getchar();
    while(!isdigit(c)) { if(c==-) f=-1; c=getchar(); } 
    while(isdigit(c)) { x=x*10+c-0; c=getchar();  }
}

void add(int u,int v,int w)
{
    to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; val[tot]=w;
    to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; val[tot]=0;
}


bool bfs()
{
    while(!q.empty()) q.pop();
    for(int i=src;i<=decc;i++) lev[i]=-1,cur[i]=front[i];
    lev[src]=0; 
    q.push(src);
    int now;
    while(!q.empty())
    {
        now=q.front(); q.pop();
        for(int i=front[now];i;i=nxt[i])
        {
            if(lev[to[i]]==-1&&val[i]>0)
            {
                lev[to[i]]=lev[now]+1;
                if(to[i]==decc) return true;
                q.push(to[i]);
            }
        }
    }
    return false;
}
int dinic(int now,int flow)
{
    if(now==decc) return flow;
    int rest=0,delta;
    for(int &i=cur[now];i;i=nxt[i])
    {
        if(lev[to[i]]>lev[now]&&val[i]>0)
        {
            delta=dinic(to[i],min(flow-rest,val[i]));
            if(delta)
            {
                val[i]-=delta; val[i^1]+=delta;
                rest+=delta; if(rest==flow) break;
            }
        }
    }
    if(rest==flow) lev[now]=-1;
    return rest;
}

 

最大流

原文:http://www.cnblogs.com/TheRoadToTheGold/p/8018424.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!