网络最大流之dinic模板

dinic:

const int maxn=55;
const int maxm=4005;

int first[maxn],iter[maxn],lvl[maxn],q[maxm];
int nex[maxm],u[maxm],v[maxm],w[maxm];
int n,m,ecnt;

void dinic_bfs(int s)
{
    int f,r,x,e;
    clr(lvl,-1);
    f=r=0;
    q[r++]=s;lvl[s]=0;
    while(f<r)
    {
        x=q[f++];
        for(e=first[x];~e;e=nex[e])
        if(w[e]&&lvl[v[e]]==-1){
            lvl[v[e]]=lvl[x]+1;
            q[r++]=v[e];
        }
    }
}

int dinic_dfs(int s,int t,int maxf)
{
    if(s==t)return maxf;
    int ret=maxf;
    for(int &e=iter[s];~e;e=nex[e])
    if(w[e]&&lvl[s]<lvl[v[e]]){
        int f=dinic_dfs(v[e],t,min(ret,w[e]));
        w[e]-=f;
        w[e^1]+=f;
        ret-=f;
    }
    return maxf-ret;
}
int max_flow(int s,int t)
{
    int f,sum=0;
    while(dinic_bfs(s),lvl[t]!=-1)
    {
        memcpy(iter,first,sizeof iter);
        while(f=dinic_dfs(s,t,INF))
            sum+=f;
    }
    return sum;
}
void add_(int a,int b,int cc)
{
    u[ecnt]=a;
    v[ecnt]=b;
    w[ecnt]=cc;
    nex[ecnt]=first[a];
    first[a]=ecnt++;
    u[ecnt]=b;
    v[ecnt]=a;
    w[ecnt]=0;
    nex[ecnt]=first[b];
    first[b]=ecnt++;
}
void min_cut()
{
    for(int i=0;i<ecnt;i+=2)
    {
        if(!w[i])w[i]=1;
        else w[i]=INF;
        w[i^1]=0;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值