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

最大流

时间:2017-12-11 00:52:57      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:bre   front   body   ++   min   push   git   ==   als   

 

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;
}

 

最大流

标签:bre   front   body   ++   min   push   git   ==   als   

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

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